/ Hex Artifact Content
Login

Artifact 46760493ebddd6360e31ff44c314d5bec04cd322:


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: 31 37 36 2e 32 2e 32 20 32 30 30 34 2f 30 37 2f  176.2.2 2004/07/
0300: 32 30 20 30 30 3a 35 30 3a 33 30 20 64 72 68 20  20 00:50:30 drh 
0310: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0320: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0330: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0340: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  h>../*.** This r
0350: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
0360: 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20   when a new SQL 
0370: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67  statement is beg
0380: 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  inning to.** be 
0390: 70 61 72 73 65 64 2e 20 20 43 68 65 63 6b 20 74  parsed.  Check t
03a0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 63 68  o see if the sch
03b0: 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74 61  ema for the data
03c0: 62 61 73 65 20 6e 65 65 64 73 0a 2a 2a 20 74 6f  base needs.** to
03d0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
03e0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
03f0: 61 6e 64 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  and SQLITE_TEMP_
0400: 4d 41 53 54 45 52 20 74 61 62 6c 65 73 2e 0a 2a  MASTER tables..*
0410: 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68  * If it does, th
0420: 65 6e 20 72 65 61 64 20 69 74 2e 0a 2a 2f 0a 76  en read it..*/.v
0430: 6f 69 64 20 73 71 6c 69 74 65 42 65 67 69 6e 50  oid sqliteBeginP
0440: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
0450: 73 65 2c 20 69 6e 74 20 65 78 70 6c 61 69 6e 46  se, int explainF
0460: 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  lag){.  sqlite *
0470: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0480: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 50 61 72  .  int i;.  pPar
0490: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 65 78  se->explain = ex
04a0: 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20 69 66 28  plainFlag;.  if(
04b0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
04c0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 29  ITE_Initialized)
04d0: 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  ==0 && db->init.
04e0: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69  busy==0 ){.    i
04f0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e  nt rc = sqliteIn
0500: 69 74 28 64 62 2c 20 26 70 50 61 72 73 65 2d 3e  it(db, &pParse->
0510: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
0520: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
0530: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0540: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
0550: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
0560: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
0570: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
0580: 69 2b 2b 29 7b 0a 20 20 20 20 44 62 43 6c 65 61  i++){.    DbClea
0590: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  rProperty(db, i,
05a0: 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a 20 20 20   DB_Locked);.   
05b0: 20 69 66 28 20 21 64 62 2d 3e 61 44 62 5b 69 5d   if( !db->aDb[i]
05c0: 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  .inTrans ){.    
05d0: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
05e0: 79 28 64 62 2c 20 69 2c 20 44 42 5f 43 6f 6f 6b  y(db, i, DB_Cook
05f0: 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ie);.    }.  }. 
0600: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0610: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
0620: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0630: 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  ed after a singl
0640: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73  has been.** pars
0660: 65 64 20 61 6e 64 20 77 65 20 77 61 6e 74 20 74  ed and we want t
0670: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 56 44  o execute the VD
0680: 42 45 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  BE code to imple
0690: 6d 65 6e 74 20 0a 2a 2a 20 74 68 61 74 20 73 74  ment .** that st
06a0: 61 74 65 6d 65 6e 74 2e 20 20 50 72 69 6f 72 20  atement.  Prior 
06b0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
06c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
06d0: 61 64 79 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74  ady.** construct
06e0: 65 64 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  ed VDBE code to 
06f0: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  do the work of t
0700: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
0710: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
0720: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 65 78  e just has to ex
0730: 65 63 75 74 65 20 74 68 65 20 56 44 42 45 20 63  ecute the VDBE c
0740: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ode..**.** Note 
0750: 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72  that if an error
0760: 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69   occurred, it mi
0770: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
0780: 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20  that.** no VDBE 
0790: 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74  code was generat
07a0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
07b0: 74 65 45 78 65 63 28 50 61 72 73 65 20 2a 70 50  teExec(Parse *pP
07c0: 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20  arse){.  sqlite 
07d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
07e0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
07f0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20  arse->pVdbe;..  
0800: 69 66 28 20 76 3d 3d 30 20 26 26 20 28 76 20 3d  if( v==0 && (v =
0810: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
0820: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
0830: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
0840: 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30 2c  p(v, OP_Halt, 0,
0850: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73   0);.  }.  if( s
0860: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
0870: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
0880: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0890: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
08a0: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
08b0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
08c0: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
08d0: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
08e0: 20 20 73 71 6c 69 74 65 56 64 62 65 54 72 61 63    sqliteVdbeTrac
08f0: 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20  e(v, trace);.   
0900: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 52   sqliteVdbeMakeR
0910: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
0920: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 65 78  nVar, pParse->ex
0930: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0940: 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d  se->rc = pParse-
0950: 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45  >nErr ? SQLITE_E
0960: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
0970: 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  NE;.    pParse->
0980: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b  colNamesSet = 0;
0990: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
09a0: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
09b0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  OK ){.    pParse
09c0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
09d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
09e0: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
09f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
0a00: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
0a10: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0a20: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
0a30: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a  e->nVar = 0;.}..
0a40: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
0a50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
0a60: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
0a70: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
0a80: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 74 61  ular database ta
0a90: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
0aa0: 6d 65 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61  me.** of that ta
0ab0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
0ac0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
0ad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0ae0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
0af0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
0b00: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
0b10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
0b20: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
0b30: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
0b40: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
0b50: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
0b60: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
0b70: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
0b80: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
0b90: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
0ba0: 74 61 62 6c 65 20 6e 61 6d 65 73 20 69 73 20 64  table names is d
0bb0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
0bc0: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
0bd0: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
0be0: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
0bf0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
0c00: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
0c10: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
0c20: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
0c30: 6c 73 6f 20 73 71 6c 69 74 65 4c 6f 63 61 74 65  lso sqliteLocate
0c40: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
0c50: 65 20 2a 73 71 6c 69 74 65 46 69 6e 64 54 61 62  e *sqliteFindTab
0c60: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63  le(sqlite *db, c
0c70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0c80: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
0c90: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
0ca0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
0cb0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0cc0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
0cd0: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
0ce0: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
0cf0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
0d00: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
0d10: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
0d20: 20 26 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d   && sqliteStrICm
0d30: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
0d40: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
0d50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
0d60: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 46 69 6e   = sqliteHashFin
0d70: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
0d80: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
0d90: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
0da0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
0db0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
0dc0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
0dd0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
0de0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0df0: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
0e00: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
0e10: 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ase table given 
0e20: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74  the name.** of t
0e30: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
0e40: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
0e50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0e60: 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  ase.** containin
0e70: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
0e80: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
0e90: 20 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20   found..** Also 
0ea0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
0eb0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
0ec0: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
0ed0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
0ee0: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
0ef0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 46  tine and sqliteF
0f00: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
0f10: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
0f20: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
0f30: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
0f40: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
0f50: 20 77 68 65 72 65 20 73 71 6c 69 74 65 46 69 6e   where sqliteFin
0f60: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
0f70: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
0f80: 69 74 65 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  iteLocateTable(P
0f90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
0fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
0fb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
0fc0: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
0fd0: 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 46  ;..  p = sqliteF
0fe0: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
0ff0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
1000: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1010: 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ){.    if( zDbas
1020: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1030: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
1040: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1050: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
1060: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
1070: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 46 69  lse if( sqliteFi
1080: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
1090: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
10a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10c0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69   "table \"%s\" i
10d0: 73 20 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73  s not in databas
10e0: 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20  e \"%s\"",.     
10f0: 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73      zName, zDbas
1100: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
1110: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
1120: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1130: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
1140: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
1150: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
1160: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
1170: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
1180: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1190: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
11a0: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
11b0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
11c0: 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  hat index.** and
11d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11e0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
11f0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
1200: 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  x..** Return NUL
1210: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1220: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
1230: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
1240: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
1250: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
1260: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
1270: 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  st matching inde
1280: 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  x is returned.  
1290: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
12a0: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e  for duplicate in
12b0: 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  dex names is don
12c0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
12d0: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
12e0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
12f0: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
1300: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
1310: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
1320: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
1330: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
1340: 69 74 65 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  iteFindIndex(sql
1350: 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  ite *db, const c
1360: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
1370: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
1380: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
1390: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
13a0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
13b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
13c0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
13d0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
13e0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
13f0: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
1400: 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 44 62 2c  liteStrICmp(zDb,
1410: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
1420: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
1430: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73     p = sqliteHas
1440: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
1450: 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ].idxHash, zName
1460: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
1470: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
1480: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1490: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
14a0: 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e  Remove the given
14b0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20   index from the 
14c0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
14d0: 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74  , and free.** it
14e0: 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  s memory structu
14f0: 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  res..**.** The i
1500: 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20  ndex is removed 
1510: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1520: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75  e hash tables bu
1530: 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75  t.** it is not u
1540: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
1550: 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69   Table that it i
1560: 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e  ndexes..** Unlin
1570: 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61  king from the Ta
1580: 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  ble must be done
1590: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
15a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
15b0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44  tic void sqliteD
15c0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
15d0: 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  e *db, Index *p)
15e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
15f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
1600: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
1610: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
1620: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
1630: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69  b->aDb[p->iDb].i
1640: 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  dxHash, p->zName
1650: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1660: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c              strl
1670: 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  en(p->zName)+1, 
1680: 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d  0);.  if( pOld!=
1690: 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a  0 && pOld!=p ){.
16a0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
16b0: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
16c0: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70  >iDb].idxHash, p
16d0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Old->zName,.    
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e   strlen(pOld->zN
1700: 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20  ame)+1, pOld);. 
1710: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
1720: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  p);.}../*.** Unl
1730: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ink the given in
1740: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62  dex from its tab
1750: 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a  le, then remove.
1760: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ** the index fro
1770: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
1780: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
1790: 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74  its memory.** st
17a0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
17b0: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
17c0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
17d0: 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  ite *db, Index *
17e0: 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28 20 70  pIndex){.  if( p
17f0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
1800: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
1810: 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  .    pIndex->pTa
1820: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
1830: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ndex->pNext;.  }
1840: 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20  else{.    Index 
1850: 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 49  *p;.    for(p=pI
1860: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
1870: 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e  ndex; p && p->pN
1880: 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70  ext!=pIndex; p=p
1890: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 69  ->pNext){}.    i
18a0: 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  f( p && p->pNext
18b0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
18c0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
18d0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
18e0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65  }.  }.  sqliteDe
18f0: 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49  leteIndex(db, pI
1900: 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
1910: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
1920: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1930: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
1940: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
1950: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
1960: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ction.  This rou
1970: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1980: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
1990: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63  .** before the c
19a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65 73  onnection closes
19b0: 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61  .  It is also ca
19c0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f  lled during a ro
19d0: 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65  llback.** if the
19e0: 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63  re were schema c
19f0: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
1a00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1a10: 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74  *.** If iDb<=0 t
1a20: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
1a30: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61  ternal schema ta
1a40: 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  bles for all dat
1a50: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20  abase.** files. 
1a60: 20 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20   If iDb>=2 then 
1a70: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
1a80: 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e  al schema for on
1a90: 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  ly the.** single
1aa0: 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e   file indicated.
1ab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 52  .*/.void sqliteR
1ac0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
1ad0: 6d 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69  ma(sqlite *db, i
1ae0: 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45  nt iDb){.  HashE
1af0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
1b00: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
1b10: 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c   temp2;.  int i,
1b20: 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   j;..  assert( i
1b30: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
1b40: 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  >nDb );.  db->fl
1b50: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
1b60: 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f  nitialized;.  fo
1b70: 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e  r(i=iDb; i<db->n
1b80: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
1b90: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
1ba0: 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d  [i];.    temp1 =
1bb0: 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20   pDb->tblHash;. 
1bc0: 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e     temp2 = pDb->
1bd0: 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71  trigHash;.    sq
1be0: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 70 44  liteHashInit(&pD
1bf0: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
1c00: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
1c10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 48   0);.    sqliteH
1c20: 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61  ashClear(&pDb->a
1c30: 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  FKey);.    sqlit
1c40: 65 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  eHashClear(&pDb-
1c50: 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66  >idxHash);.    f
1c60: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
1c70: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32 29  ashFirst(&temp2)
1c80: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
1c90: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
1ca0: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 72 69  lem)){.      Tri
1cb0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d  gger *pTrigger =
1cc0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
1cd0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  pElem);.      sq
1ce0: 6c 69 74 65 44 65 6c 65 74 65 54 72 69 67 67 65  liteDeleteTrigge
1cf0: 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  r(pTrigger);.   
1d00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73   }.    sqliteHas
1d10: 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a  hClear(&temp2);.
1d20: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
1d30: 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68  it(&pDb->tblHash
1d40: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
1d50: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f  RING, 0);.    fo
1d60: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
1d70: 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b  shFirst(&temp1);
1d80: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
1d90: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
1da0: 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  em)){.      Tabl
1db0: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
1dc0: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
1dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
1de0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
1df0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
1e00: 6c 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 74  liteHashClear(&t
1e10: 65 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65  emp1);.    DbCle
1e20: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
1e30: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
1e40: 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  d);.    if( iDb>
1e50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
1e60: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
1e70: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
1e80: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
1e90: 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20  nChanges;..  /* 
1ea0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
1eb0: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
1ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
1ed0: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
1ee0: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
1ef0: 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61   then from the a
1f00: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
1f10: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
1f20: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
1f30: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
1f40: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
1f50: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
1f60: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
1f70: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
1f80: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
1f90: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
1fa0: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
1fb0: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
1fc0: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
1fd0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1fe0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1ff0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
2000: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
2010: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
2020: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Bt==0 ){.      i
2030: 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20  f( pDb->pAux && 
2040: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20  pDb->xFreeAux ) 
2050: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44  pDb->xFreeAux(pD
2060: 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  b->pAux);.      
2070: 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  pDb->pAux = 0;. 
2080: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
2090: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
20a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
20b0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
20c0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
20d0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
20e0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
20f0: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb->zName);.  
2100: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
2110: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
2120: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
2130: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2140: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
2150: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
2160: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
2170: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
2180: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
2190: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
21a0: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
21b0: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
21c0: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
21d0: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
21e0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
21f0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
2200: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
2210: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
2220: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
2230: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2240: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
2250: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2260: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2270: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
2280: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
2290: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
22a0: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
22b0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
22c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
22d0: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
22e0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
22f0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
2300: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
2310: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
2320: 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e  sqliteRollbackIn
2330: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2340: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
2350: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2360: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2370: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52  s ){.    sqliteR
2380: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2390: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d  ma(db, 0);.  }.}
23a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
23b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
23c0: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
23d0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
23e0: 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  iteCommitInterna
23f0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2400: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
2410: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
2420: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
2430: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
2440: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
2450: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2460: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
2470: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
2480: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2490: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
24a0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
24b0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
24c0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
24d0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
24e0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
24f0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
2500: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
2510: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
2520: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
2530: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
2540: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
2550: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
2560: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
2570: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
2580: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2590: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
25a0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
25b0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
25c0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
25d0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
25e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25f0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
2600: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
2610: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2620: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
2630: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
2640: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
2650: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
2660: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
2670: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
2680: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2690: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
26a0: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
26b0: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
26c0: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
26d0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26e0: 65 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  eDeleteTable(sql
26f0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
2700: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
2710: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ;.  Index *pInde
2720: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65  x, *pNext;.  FKe
2730: 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74  y *pFKey, *pNext
2740: 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61  FKey;..  if( pTa
2750: 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ble==0 ) return;
2760: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2770: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
2780: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
2790: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  able.  */.  for(
27a0: 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d  pIndex = pTable-
27b0: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
27c0: 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a   pIndex=pNext){.
27d0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64      pNext = pInd
27e0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61  ex->pNext;.    a
27f0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 69  ssert( pIndex->i
2800: 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20  Db==pTable->iDb 
2810: 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d  || (pTable->iDb=
2820: 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69 44  =0 && pIndex->iD
2830: 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71 6c  b==1) );.    sql
2840: 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64  iteDeleteIndex(d
2850: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
2860: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
2870: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
2880: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2890: 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b  is table.  The k
28a0: 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  eys.  ** should 
28b0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
28c0: 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  n unlinked from 
28d0: 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68 61  the db->aFKey ha
28e0: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
28f0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
2900: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
2910: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
2920: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
2930: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
2940: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
2950: 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d   pTable->iDb<db-
2960: 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
2970: 72 74 28 20 73 71 6c 69 74 65 48 61 73 68 46 69  rt( sqliteHashFi
2980: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62  nd(&db->aDb[pTab
2990: 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a  le->iDb].aFKey,.
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79             pFKey
29c0: 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46  ->zTo, strlen(pF
29d0: 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46  Key->zTo)+1)!=pF
29e0: 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Key );.    sqlit
29f0: 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20  eFree(pFKey);.  
2a00: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  }..  /* Delete t
2a10: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2a20: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
2a30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2a40: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ble->nCol; i++){
2a50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2a60: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2a70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2a80: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2a90: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b 0a 20  Col[i].zDflt);. 
2aa0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
2ab0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54  able->aCol[i].zT
2ac0: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2ad0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
2ae0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  Name);.  sqliteF
2af0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2b00: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
2b10: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
2b20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
2b30: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
2b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
2b50: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
2b60: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
2b70: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
2b80: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
2b90: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
2ba0: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
2bb0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
2bc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2bd0: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
2be0: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
2bf0: 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  te *db, Table *p
2c00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  ){.  Table *pOld
2c10: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
2c20: 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  pF2;.  int i = p
2c30: 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28  ->iDb;.  assert(
2c40: 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64   db!=0 );.  pOld
2c50: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73   = sqliteHashIns
2c60: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2c70: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
2c80: 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61  e, strlen(p->zNa
2c90: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2ca0: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2cb0: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72  pOld==p );.  for
2cc0: 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  (pF1=p->pFKey; p
2cd0: 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65  F1; pF1=pF1->pNe
2ce0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74  xtFrom){.    int
2cf0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
2d00: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
2d10: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 48 61 73   pF2 = sqliteHas
2d20: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69  hFind(&db->aDb[i
2d30: 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ].aFKey, pF1->zT
2d40: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28  o, nTo);.    if(
2d50: 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20   pF2==pF1 ){.   
2d60: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
2d70: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert(&db->aDb[i].
2d80: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
2d90: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
2da0: 54 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  To);.    }else{.
2db0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
2dc0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
2dd0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
2de0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
2df0: 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20     if( pF2 ){.  
2e00: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
2e10: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
2e20: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
2e30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c  .  }.  sqliteDel
2e40: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
2e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
2e60: 75 63 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  uct the name of 
2e70: 61 20 75 73 65 72 20 74 61 62 6c 65 20 6f 72 20  a user table or 
2e80: 69 6e 64 65 78 20 66 72 6f 6d 20 61 20 74 6f 6b  index from a tok
2e90: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  en..**.** Space 
2ea0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
2eb0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
2ec0: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
2ed0: 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20   and must.** be 
2ee0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
2ef0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2f00: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 54 61  /.char *sqliteTa
2f10: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
2f20: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
2f30: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2f40: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
2f50: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
2f60: 29 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f  );.  sqliteDequo
2f70: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  te(zName);.  ret
2f80: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
2f90: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2fa0: 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 61 70  e to open the ap
2fb0: 70 72 6f 70 72 69 61 74 65 20 6d 61 73 74 65 72  propriate master
2fc0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 74 61 62   table.  The tab
2fd0: 6c 65 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69 6c  le.** opened wil
2fe0: 6c 20 62 65 20 53 51 4c 49 54 45 5f 4d 41 53 54  l be SQLITE_MAST
2ff0: 45 52 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ER for persisten
3000: 74 20 74 61 62 6c 65 73 20 61 6e 64 20 0a 2a 2a  t tables and .**
3010: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53   SQLITE_TEMP_MAS
3020: 54 45 52 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  TER for temporar
3030: 79 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 74  y tables.  The t
3040: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 0a 2a  able is opened.*
3050: 2a 20 6f 6e 20 63 75 72 73 6f 72 20 30 2e 0a 2a  * on cursor 0..*
3060: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 70 65  /.void sqliteOpe
3070: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3080: 65 20 2a 76 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *v, int isTemp
3090: 29 7b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41  ){.  sqliteVdbeA
30a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
30b0: 65 72 2c 20 69 73 54 65 6d 70 2c 20 30 29 3b 0a  er, isTemp, 0);.
30c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
30d0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
30e0: 65 2c 20 30 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a  e, 0, 2);.}../*.
30f0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
3100: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
3110: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
3120: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
3130: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
3140: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
3150: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
3160: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
3170: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
3180: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
3190: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
31a0: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
31b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
31c0: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
31d0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
31e0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
31f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3200: 20 54 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74   The.** pStart t
3210: 6f 6b 65 6e 20 69 73 20 74 68 65 20 43 52 45 41  oken is the CREA
3220: 54 45 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20  TE and pName is 
3230: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
3240: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
3250: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
3260: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
3270: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
3280: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3290: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
32a0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
32b0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
32c0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
32d0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
32e0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
32f0: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
3300: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
3310: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
3320: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
3330: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
3340: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
3350: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
3360: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
3370: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
3380: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
3390: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
33a0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
33b0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
33c0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
33d0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
33e0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
33f0: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
3400: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
3410: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
3420: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
3430: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 29  sqliteEndTable()
3440: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
3450: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
3460: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
3470: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
3480: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
3490: 6f 69 64 20 73 71 6c 69 74 65 53 74 61 72 74 54  oid sqliteStartT
34a0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
34b0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
34c0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
34d0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
34e0: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
34f0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
3500: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  n *pName,    /* 
3510: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
3520: 20 76 69 65 77 20 74 6f 20 63 72 65 61 74 65 20   view to create 
3530: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
3540: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3550: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
3560: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
3570: 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54  sView       /* T
3580: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3590: 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61   VIEW */.){.  Ta
35a0: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49  ble *pTable;.  I
35b0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68  ndex *pIdx;.  ch
35c0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
35d0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
35e0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
35f0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 70  .  int iDb;..  p
3600: 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f 6b  Parse->sFirstTok
3610: 65 6e 20 3d 20 2a 70 53 74 61 72 74 3b 0a 20 20  en = *pStart;.  
3620: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 54 61  zName = sqliteTa
3630: 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  bleNameFromToken
3640: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
3650: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
3660: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
3670: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
3680: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
3690: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
36a0: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
36b0: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
36c0: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
36d0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
36e0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 69 73 54 65  char *zDb = isTe
36f0: 6d 70 20 3f 20 22 74 65 6d 70 22 20 3a 20 22 6d  mp ? "temp" : "m
3700: 61 69 6e 22 3b 0a 20 20 20 20 69 66 28 20 73 71  ain";.    if( sq
3710: 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50  liteAuthCheck(pP
3720: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
3730: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
3740: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
3750: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
3760: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
3770: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
3780: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
3790: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
37a0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
37b0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
37c0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
37d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
37e0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
37f0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
3800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
3810: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  se{.      if( is
3820: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
3830: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
3840: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
3850: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3860: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
3870: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
3880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3890: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
38a0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
38b0: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
38c0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
38d0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
38e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
38f0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
3900: 20 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74   ..  /* Before t
3910: 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20  rying to create 
3920: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
3930: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
3940: 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20   Btree for.  ** 
3950: 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72  holding temporar
3960: 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e  y tables is open
3970: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  ..  */.  if( isT
3980: 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31  emp && db->aDb[1
3990: 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
39a0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
39b0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
39c0: 69 74 65 42 74 72 65 65 46 61 63 74 6f 72 79 28  iteBtreeFactory(
39d0: 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41  db, 0, 0, MAX_PA
39e0: 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d  GES, &db->aDb[1]
39f0: 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72  .pBt);.    if( r
3a00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3a10: 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f        sqliteErro
3a20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
3a30: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
3a40: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
3a50: 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
3a60: 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
3a70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
3a80: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
3a90: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
3aa0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
3ab0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
3ac0: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 20 29  SQLITE_InTrans )
3ad0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
3ae0: 69 74 65 42 74 72 65 65 42 65 67 69 6e 54 72 61  iteBtreeBeginTra
3af0: 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
3b00: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
3b10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 72 72         sqliteErr
3b30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
3b40: 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77  nable to get a w
3b50: 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20  rite lock on ". 
3b60: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74 65           "the te
3b70: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
3b80: 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20   file");.       
3b90: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
3ba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3bb0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
3bc0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
3bd0: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
3be0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
3bf0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
3c00: 62 6c 65 20 6e 61 6d 65 2e 20 20 49 73 73 75 65  ble name.  Issue
3c10: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
3c20: 65 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  e if it does..  
3c30: 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 61 72  **.  ** If we ar
3c40: 65 20 72 65 2d 72 65 61 64 69 6e 67 20 74 68 65  e re-reading the
3c50: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
3c60: 61 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20  able because of 
3c70: 61 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 63 68  a schema.  ** ch
3c80: 61 6e 67 65 20 61 6e 64 20 61 20 6e 65 77 20 70  ange and a new p
3c90: 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69  ermanent table i
3ca0: 73 20 66 6f 75 6e 64 20 77 68 6f 73 65 20 6e 61  s found whose na
3cb0: 6d 65 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  me collides with
3cc0: 0a 20 20 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  .  ** an existin
3cd0: 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
3ce0: 65 2c 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  e, that is not a
3cf0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
3d00: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 46  pTable = sqliteF
3d10: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
3d20: 6d 65 2c 20 30 29 3b 0a 20 20 69 44 62 20 3d 20  me, 0);.  iDb = 
3d30: 69 73 54 65 6d 70 20 3f 20 31 20 3a 20 64 62 2d  isTemp ? 1 : db-
3d40: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 69 66 28  >init.iDb;.  if(
3d50: 20 70 54 61 62 6c 65 21 3d 30 20 26 26 20 28 70   pTable!=0 && (p
3d60: 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 69 44 62 20  Table->iDb==iDb 
3d70: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
3d80: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
3d90: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3da0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
3db0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
3dc0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
3dd0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
3de0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
3df0: 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 46   (pIdx = sqliteF
3e00: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
3e10: 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 0a 20 20  me, 0))!=0 &&.  
3e20: 20 20 20 20 20 20 20 20 28 70 49 64 78 2d 3e 69          (pIdx->i
3e30: 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e  Db==0 || !db->in
3e40: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
3e50: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
3e60: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
3e70: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
3e80: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
3e90: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
3ea0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
3eb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
3ec0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  able = sqliteMal
3ed0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
3ee0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
3ef0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
3f00: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
3f10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3f20: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
3f30: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
3f40: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->nCol = 0;.  p
3f50: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
3f60: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  .  pTable->iPKey
3f70: 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d   = -1;.  pTable-
3f80: 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70  >pIndex = 0;.  p
3f90: 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62  Table->iDb = iDb
3fa0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
3fb0: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
3fc0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
3fd0: 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  , pParse->pNewTa
3fe0: 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ble);.  pParse->
3ff0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
4000: 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  le;..  /* Begin 
4010: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
4020: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
4030: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
4040: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
4050: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
4060: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
4070: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
4080: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
4090: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
40a0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
40b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
40c0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
40d0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
40e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
40f0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
4100: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
4110: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
4120: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
4130: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
4140: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
4150: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
4160: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
4170: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
4180: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
4190: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
41a0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
41b0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
41c0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
41d0: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
41e0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
41f0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
4200: 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69    sqliteBeginWri
4210: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
4220: 73 65 2c 20 30 2c 20 69 73 54 65 6d 70 29 3b 0a  se, 0, isTemp);.
4230: 20 20 20 20 69 66 28 20 21 69 73 54 65 6d 70 20      if( !isTemp 
4240: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  ){.      sqliteV
4250: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4260: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65  nteger, db->file
4270: 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  _format, 0);.   
4280: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4290: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
42a0: 69 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ie, 0, 1);.    }
42b0: 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e 4d  .    sqliteOpenM
42c0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 73  asterTable(v, is
42d0: 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
42e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
42f0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
4300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
4310: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
4320: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4330: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4340: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
4350: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
4360: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
4370: 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tKey, 0, 0);.  }
4380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
4390: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
43a0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
43b0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
43c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
43d0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
43e0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
43f0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
4400: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
4410: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
4420: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
4430: 65 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  eStartTable() ge
4440: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
4450: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
4460: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
4470: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4480: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
4490: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
44a0: 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e   sqliteAddColumn
44b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
44c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
44d0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
44e0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20   i;.  char *z = 
44f0: 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
4500: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
4510: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
4520: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4530: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
4540: 28 26 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  (&z, pName->z, p
4550: 4e 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 69  Name->n, 0);.  i
4560: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
4570: 3b 0a 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74  ;.  sqliteDequot
4580: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
4590: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
45a0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
45b0: 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43  StrICmp(z, p->aC
45c0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[i].zName)==0 
45d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  ){.      sqliteE
45e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
45f0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
4600: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
4610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
4620: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
4630: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
4640: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
4650: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
4660: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
4670: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
4680: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
4690: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
46a0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
46b0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
46c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d  ) return;.    p-
46d0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
46e0: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
46f0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
4700: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
4710: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
4720: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
4730: 6d 65 20 3d 20 7a 3b 0a 20 20 70 43 6f 6c 2d 3e  me = z;.  pCol->
4740: 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
4750: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 70 2d 3e  TE_SO_NUM;.  p->
4760: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
4770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4780: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
4790: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
47a0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
47b0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
47c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
47d0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
47e0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
47f0: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
4800: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
4810: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4820: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
4830: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
4840: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
4850: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4860: 6f 69 64 20 73 71 6c 69 74 65 41 64 64 4e 6f 74  oid sqliteAddNot
4870: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
4880: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
4890: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
48a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
48b0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
48c0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
48d0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
48e0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
48f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
4900: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
4910: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4920: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
4930: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
4940: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
4950: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
4960: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
4970: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
4980: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
4990: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
49a0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
49b0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
49c0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
49d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
49e0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
49f0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
4a00: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
4a10: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
4a20: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
4a30: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
4a40: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
4a50: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
4a60: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
4a70: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
4a80: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
4a90: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
4aa0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
4ab0: 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d  d sqliteAddColum
4ac0: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
4ad0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
4ae0: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
4af0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4b00: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
4b10: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
4b20: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
4b30: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
4b40: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4b50: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
4b60: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
4b70: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
4b80: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
4b90: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
4ba0: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
4bb0: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
4bc0: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
4bd0: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
4be0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 74 4e 53  );.  sqliteSetNS
4bf0: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
4c00: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
4c10: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
4c20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
4c30: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
4c40: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
4c50: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
4c60: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
4c70: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
4c80: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
4c90: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72   = 0;.  if( pPar
4ca0: 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  se->db->file_for
4cb0: 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 70 43  mat>=4 ){.    pC
4cc0: 6f 6c 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  ol->sortOrder = 
4cd0: 73 71 6c 69 74 65 43 6f 6c 6c 61 74 65 54 79 70  sqliteCollateTyp
4ce0: 65 28 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  e(z, n);.  }else
4cf0: 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 6f 72 74  {.    pCol->sort
4d00: 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
4d10: 4f 5f 4e 55 4d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  O_NUM;.  }.}../*
4d20: 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f  .** The given to
4d30: 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ken is the defau
4d40: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
4d50: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
4d60: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62  ed to.** the tab
4d70: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
4d80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
4d90: 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22    If "minusFlag"
4da0: 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20   is true, it.** 
4db0: 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20  means the value 
4dc0: 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64  token was preced
4dd0: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
4de0: 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gn..**.** This r
4df0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4e00: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
4e10: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
4e20: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
4e30: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
4e40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
4e50: 69 64 20 73 71 6c 69 74 65 41 64 64 44 65 66 61  id sqliteAddDefa
4e60: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
4e70: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
4e80: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
4e90: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
4ea0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
4eb0: 20 2a 2a 70 7a 3b 0a 20 20 69 66 28 20 28 70 20   **pz;.  if( (p 
4ec0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
4ed0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
4ee0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
4ef0: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
4f00: 65 74 75 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70  eturn;.  pz = &p
4f10: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b  ->aCol[i].zDflt;
4f20: 0a 20 20 69 66 28 20 6d 69 6e 75 73 46 6c 61 67  .  if( minusFlag
4f30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
4f40: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22  tNString(pz, "-"
4f50: 2c 20 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56  , 1, pVal->z, pV
4f60: 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c  al->n, 0);.  }el
4f70: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  se{.    sqliteSe
4f80: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61  tNString(pz, pVa
4f90: 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30  l->z, pVal->n, 0
4fa0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 44  );.  }.  sqliteD
4fb0: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
4fc0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
4fd0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
4fe0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
4ff0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
5000: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
5010: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
5020: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
5030: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
5040: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
5050: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
5060: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
5070: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
5080: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
5090: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
50a0: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
50b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
50c0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
50d0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
50e0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
50f0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
5100: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
5110: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
5120: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
5130: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5140: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
5150: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
5160: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
5170: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
5180: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
5190: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
51a0: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
51b0: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
51c0: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
51d0: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
51e0: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
51f0: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
5200: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
5210: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
5220: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
5230: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
5240: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
5250: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
5260: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
5270: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
5280: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
5290: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
52a0: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
52b0: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
52c0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
52d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
52e0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
52f0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
5300: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5310: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
5320: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
5330: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
5340: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
5350: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
5360: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
5370: 76 6f 69 64 20 73 71 6c 69 74 65 41 64 64 50 72  void sqliteAddPr
5380: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
5390: 70 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a  pParse, IdList *
53a0: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
53b0: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
53c0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
53d0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
53e0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
53f0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
5400: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
5410: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
5420: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
5430: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
5440: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
5450: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
5460: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
5470: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
5480: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
5490: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
54a0: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
54b0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
54c0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
54d0: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
54e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
54f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
5500: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
5510: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
5520: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5530: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
5540: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
5550: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
5560: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
5570: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
5580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
5590: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
55a0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
55b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
55c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
55d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
55e0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
55f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5600: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
5610: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5620: 4c 69 73 74 2d 3e 6e 49 64 3e 31 20 29 20 69 43  List->nId>1 ) iC
5630: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
5640: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
5650: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
5660: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
5670: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
5680: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ype;.  }.  if( p
5690: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 69 6c 65 5f  Parse->db->file_
56a0: 66 6f 72 6d 61 74 3e 3d 31 20 26 26 20 0a 20 20  format>=1 && .  
56b0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 26           zType &
56c0: 26 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  & sqliteStrICmp(
56d0: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
56e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
56f0: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
5700: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
5710: 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d  f = onError;.  }
5720: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
5730: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
5740: 73 65 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c  se, 0, 0, pList,
5750: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
5760: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
5770: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
5780: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 49  _exit:.  sqliteI
5790: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
57a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
57b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
57c0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
57d0: 6c 6c 61 74 69 6e 67 20 74 79 70 65 20 67 69 76  llating type giv
57e0: 65 6e 20 61 20 74 79 70 65 20 6e 61 6d 65 2e 0a  en a type name..
57f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
5800: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 65 78 74  ion type is text
5810: 20 28 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54   (SQLITE_SO_TEXT
5820: 29 20 69 66 20 74 68 65 20 74 79 70 65 0a 2a 2a  ) if the type.**
5830: 20 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74   name contains t
5840: 68 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  he character str
5850: 65 61 6d 20 22 74 65 78 74 22 20 6f 72 20 22 62  eam "text" or "b
5860: 6c 6f 62 22 20 6f 72 0a 2a 2a 20 22 63 6c 6f 62  lob" or.** "clob
5870: 22 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 74 79  ".  Any other ty
5880: 70 65 20 6e 61 6d 65 20 69 73 20 63 6f 6c 6c 61  pe name is colla
5890: 74 65 64 20 61 73 20 6e 75 6d 65 72 69 63 0a 2a  ted as numeric.*
58a0: 2a 20 28 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  * (SQLITE_SO_NUM
58b0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
58c0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 63 6f 6e 73  CollateType(cons
58d0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
58e0: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74  nt nType){.  int
58f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
5900: 3c 6e 54 79 70 65 2d 33 3b 20 69 2b 2b 29 7b 0a  <nType-3; i++){.
5910: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 28 7a 54      int c = *(zT
5920: 79 70 65 2b 2b 29 20 7c 20 30 78 36 30 3b 0a 20  ype++) | 0x60;. 
5930: 20 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 7c     if( (c=='b' |
5940: 7c 20 63 3d 3d 27 63 27 29 20 26 26 20 73 71 6c  | c=='c') && sql
5950: 69 74 65 53 74 72 4e 49 43 6d 70 28 7a 54 79 70  iteStrNICmp(zTyp
5960: 65 2c 20 22 6c 6f 62 22 2c 20 33 29 3d 3d 30 20  e, "lob", 3)==0 
5970: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5980: 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54 3b 0a  SQLITE_SO_TEXT;.
5990: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
59a0: 3d 27 63 27 20 26 26 20 73 71 6c 69 74 65 53 74  ='c' && sqliteSt
59b0: 72 4e 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 68  rNICmp(zType, "h
59c0: 61 72 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  ar", 3)==0 ){.  
59d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
59e0: 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 7d  E_SO_TEXT;.    }
59f0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20  .    if( c=='t' 
5a00: 26 26 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  && sqliteStrNICm
5a10: 70 28 7a 54 79 70 65 2c 20 22 65 78 74 22 2c 20  p(zType, "ext", 
5a20: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  3)==0 ){.      r
5a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
5a40: 54 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TEXT;.    }.  }.
5a50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5a60: 53 4f 5f 4e 55 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  SO_NUM;.}../*.**
5a70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5a80: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
5a90: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
5aa0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
5ab0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
5ac0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5ad0: 2e 20 20 41 20 22 43 4f 4c 4c 41 54 45 22 20 63  .  A "COLLATE" c
5ae0: 6c 61 75 73 65 20 68 61 73 0a 2a 2a 20 62 65 65  lause has.** bee
5af0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
5b00: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
5b10: 65 20 73 65 74 73 20 74 68 65 20 43 6f 6c 75 6d  e sets the Colum
5b20: 6e 2e 73 6f 72 74 4f 72 64 65 72 20 6f 6e 0a 2a  n.sortOrder on.*
5b30: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
5b40: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
5b50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
5b60: 69 64 20 73 71 6c 69 74 65 41 64 64 43 6f 6c 6c  id sqliteAddColl
5b70: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
5b80: 50 61 72 73 65 2c 20 69 6e 74 20 63 6f 6c 6c 54  Parse, int collT
5b90: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
5ba0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
5bb0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5bc0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5bd0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5be0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5bf0: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 73  0 ) p->aCol[i].s
5c00: 6f 72 74 4f 72 64 65 72 20 3d 20 63 6f 6c 6c 54  ortOrder = collT
5c10: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ype;.}../*.** Co
5c20: 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77  me up with a new
5c30: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f   random value fo
5c40: 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  r the schema coo
5c50: 6b 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a  kie.  Make sure.
5c60: 2a 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ** the new value
5c70: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
5c80: 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a  om the old..**.*
5c90: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
5ca0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
5cb0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
5cc0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
5cd0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
5ce0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
5cf0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
5d00: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
5d10: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
5d20: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
5d30: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
5d40: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
5d50: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
5d60: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
5d70: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
5d80: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
5d90: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
5da0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
5db0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
5dc0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
5dd0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
5de0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
5df0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
5e00: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
5e10: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
5e20: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
5e30: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
5e40: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
5e50: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
5e60: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
5e70: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
5e80: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
5e90: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
5ea0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
5eb0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
5ec0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
5ed0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
5ee0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
5ef0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
5f00: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
5f10: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
5f20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 68 61  /.void sqliteCha
5f30: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
5f40: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 29 7b 0a   *db, Vdbe *v){.
5f50: 20 20 69 66 28 20 64 62 2d 3e 6e 65 78 74 5f 63    if( db->next_c
5f60: 6f 6f 6b 69 65 3d 3d 64 62 2d 3e 61 44 62 5b 30  ookie==db->aDb[0
5f70: 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ].schema_cookie 
5f80: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
5f90: 63 68 61 72 20 72 3b 0a 20 20 20 20 73 71 6c 69  char r;.    sqli
5fa0: 74 65 52 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20  teRandomness(1, 
5fb0: 26 72 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 65 78  &r);.    db->nex
5fc0: 74 5f 63 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 61  t_cookie = db->a
5fd0: 44 62 5b 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  Db[0].schema_coo
5fe0: 6b 69 65 20 2b 20 72 20 2b 20 31 3b 0a 20 20 20  kie + r + 1;.   
5ff0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
6000: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
6010: 65 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  es;.    sqliteVd
6020: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
6030: 74 65 67 65 72 2c 20 64 62 2d 3e 6e 65 78 74 5f  teger, db->next_
6040: 63 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 20 20  cookie, 0);.    
6050: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6060: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6070: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
6080: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
6090: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
60a0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
60b0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
60c0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
60d0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
60e0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
60f0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
6100: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
6110: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
6120: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
6130: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
6140: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
6150: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
6160: 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  int needQuote = 
6170: 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  0;.  for(n=0; *z
6180: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
6190: 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b   if( *z=='\'' ){
61a0: 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d   n++; needQuote=
61b0: 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  1; }.  }.  retur
61c0: 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a  n n + needQuote*
61d0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  2;.}../*.** Writ
61e0: 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  e an identifier 
61f0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
6200: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
6210: 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20  .  Add.** quote 
6220: 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65  characters as ne
6230: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
6240: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
6250: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
6260: 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b  , char *zIdent){
6270: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
6280: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
6290: 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  Idx;.  for(j=0; 
62a0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
62b0: 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75  .    if( !isalnu
62c0: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
62d0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
62e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
62f0: 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e  edQuote =  zIden
6300: 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67  t[j]!=0 || isdig
6310: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 7c 7c 20 73 71 6c 69 74 65 4b 65 79 77 6f 72 64  || sqliteKeyword
6340: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
6350: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
6360: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
6370: 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a   = '\'';.  for(j
6380: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
6390: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
63a0: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
63b0: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
63c0: 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  '\'' ) z[i++] = 
63d0: 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20  '\'';.  }.  if( 
63e0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
63f0: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69  +] = '\'';.  z[i
6400: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
6410: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
6420: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
6430: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
6440: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
6450: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
6460: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
6470: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
6480: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
6490: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
64a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
64b0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
64c0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
64d0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
64e0: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
64f0: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
6500: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
6510: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
6520: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
6530: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
6540: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
6550: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
6560: 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  i++){.    n += i
6570: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43  dentLength(p->aC
6580: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
6590: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
65a0: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
65b0: 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20    if( n<40 ){.  
65c0: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
65d0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
65e0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
65f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
6600: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
6610: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
6620: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
6630: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
6640: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
6650: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
6660: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
6670: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
6680: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
6690: 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31  zStmt, p->iDb==1
66a0: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
66b0: 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54  TABLE " : "CREAT
66c0: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
66d0: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
66e0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
66f0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
6700: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
6710: 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '(';.  for(i=0;
6720: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
6730: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
6740: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
6750: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
6760: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
6770: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
6780: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
6790: 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   &k, p->aCol[i].
67a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 74  zName);.  }.  st
67b0: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
67c0: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
67d0: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
67e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
67f0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
6800: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
6810: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
6820: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
6830: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
6840: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
6850: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
6860: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
6870: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
6880: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
6890: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
68a0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
68b0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
68c0: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
68d0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
68e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
68f0: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
6900: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
6910: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
6920: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
6930: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
6940: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
6950: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
6960: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
6970: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
6980: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6990: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
69a0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
69b0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
69c0: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
69d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
69e0: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
69f0: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20  cently changes, 
6a00: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
6a10: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
6a20: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
6a30: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6a40: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
6a50: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
6a60: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
6a70: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
6a80: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
6a90: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
6aa0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
6ab0: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
6ac0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
6ad0: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
6ae0: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
6af0: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
6b00: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
6b10: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
6b20: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
6b30: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
6b40: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
6b50: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
6b60: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
6b70: 74 65 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  teEndTable(Parse
6b80: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
6b90: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
6ba0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
6bb0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *p;.  sqlite *d
6bc0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6bd0: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
6be0: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
6bf0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
6c00: 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  | sqlite_malloc_
6c10: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
6c20: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
6c30: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
6c40: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
6c50: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
6c60: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
6c70: 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74 68  rom a SELECT, th
6c80: 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  en construct the
6c90: 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63 6f  .  ** list of co
6ca0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74 65  lumns and the te
6cb0: 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  xt of the table.
6cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  .  */.  if( pSel
6cd0: 65 63 74 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  ect ){.    Table
6ce0: 20 2a 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69   *pSelTab = sqli
6cf0: 74 65 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  teResultSetOfSel
6d00: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
6d10: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
6d20: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
6d30: 74 75 72 6e 3b 0a 20 20 20 20 61 73 73 65 72 74  turn;.    assert
6d40: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
6d50: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
6d60: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
6d70: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
6d80: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70 53  ab->aCol;.    pS
6d90: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
6da0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43  .    pSelTab->aC
6db0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ol = 0;.    sqli
6dc0: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  teDeleteTable(0,
6dd0: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 7d 0a 0a   pSelTab);.  }..
6de0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
6df0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
6e00: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
6e10: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
6e20: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
6e30: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
6e40: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
6e50: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
6e60: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
6e70: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
6e80: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
6e90: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
6ea0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
6eb0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
6ec0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
6ed0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
6ee0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
6ef0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
6f00: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
6f10: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
6f20: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
6f30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
6f40: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
6f50: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
6f60: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
6f70: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
6f80: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
6f90: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
6fa0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
6fb0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
6fc0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
6fd0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
6fe0: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
6ff0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
7000: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
7010: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
7020: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
7030: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
7040: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
7050: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
7060: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
7070: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
7080: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
7090: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
70a0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
70b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
70c0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
70d0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
70e0: 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73  e *v;..    v = s
70f0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
7100: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
7110: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
7120: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
7130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
7140: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
7150: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  /.      sqliteVd
7160: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61  beOp3(v, OP_Crea
7170: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
7180: 44 62 2c 20 28 63 68 61 72 2a 29 26 70 2d 3e 74  Db, (char*)&p->t
7190: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
71a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
71b0: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
71c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
71d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
71e0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
71f0: 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
7200: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  0;.    sqliteVdb
7210: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
7220: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 1, 0);.    sq
7230: 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f  liteVdbeOp3(v, O
7240: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
7250: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74  p->pSelect==0?"t
7260: 61 62 6c 65 22 3a 22 76 69 65 77 22 2c 20 50 33  able":"view", P3
7270: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
7280: 6c 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f  liteVdbeOp3(v, O
7290: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
72a0: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
72b0: 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28    sqliteVdbeOp3(
72c0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
72d0: 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29   0, p->zName, 0)
72e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
72f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
7300: 20 34 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   4, 0);.    sqli
7310: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
7320: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
7330: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
7340: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
7350: 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  z = createTableS
7360: 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e 20  tmt(p);.      n 
7370: 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20  = z ? strlen(z) 
7380: 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  : 0;.      sqlit
7390: 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  eVdbeChangeP3(v,
73a0: 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
73b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
73c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
73d0: 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d    assert( pEnd!=
73e0: 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41  0 );.      n = A
73f0: 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41  ddr(pEnd->z) - A
7400: 64 64 72 28 70 50 61 72 73 65 2d 3e 73 46 69 72  ddr(pParse->sFir
7410: 73 74 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  stToken.z) + 1;.
7420: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7430: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
7440: 70 50 61 72 73 65 2d 3e 73 46 69 72 73 74 54 6f  pParse->sFirstTo
7450: 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d  ken.z, n);.    }
7460: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
7470: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
7480: 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a 20 20  ecord, 5, 0);.  
7490: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
74a0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
74b0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
74c0: 28 20 21 70 2d 3e 69 44 62 20 29 7b 0a 20 20 20  ( !p->iDb ){.   
74d0: 20 20 20 73 71 6c 69 74 65 43 68 61 6e 67 65 43     sqliteChangeC
74e0: 6f 6f 6b 69 65 28 64 62 2c 20 76 29 3b 0a 20 20  ookie(db, v);.  
74f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
7500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
7510: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
7520: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
7530: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
7540: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
7550: 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  er, p->iDb, 0);.
7560: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
7570: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
7580: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
7590: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
75a0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
75b0: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
75c0: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
75d0: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29  ble, 1, 0, 0, 0)
75e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
75f0: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
7600: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
7610: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
7620: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
7630: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
7640: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
7650: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
7660: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
7670: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
7680: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  Err==0 ){.    Ta
7690: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46  ble *pOld;.    F
76a0: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20  Key *pFKey;.    
76b0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73  pOld = sqliteHas
76c0: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
76d0: 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68  [p->iDb].tblHash
76e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7700: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
7710: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
7720: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
7730: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7740: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
7750: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
7760: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
7770: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
7780: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7790: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
77a0: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
77b0: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
77c0: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
77d0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
77e0: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
77f0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
7800: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 48 61  extTo = sqliteHa
7810: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
7820: 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70  p->iDb].aFKey, p
7830: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b  FKey->zTo, nTo);
7840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 48 61 73  .      sqliteHas
7850: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
7860: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
7870: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c  pFKey->zTo, nTo,
7880: 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20   pFKey);.    }. 
7890: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
78a0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
78b0: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
78c0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
78d0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
78e0: 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s;.  }.}../*.** 
78f0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7900: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
7910: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
7920: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
7930: 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74 65  oid sqliteCreate
7940: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
7950: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
7960: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7970: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
7980: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
7990: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
79a0: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
79b0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
79c0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
79d0: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
79e0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
79f0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
7a00: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
7a10: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
7a20: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
7a30: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
7a40: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
7a50: 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20 20  t isTemp        
7a60: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
7a70: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
7a80: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
7a90: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
7aa0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
7ab0: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
7ac0: 72 20 73 46 69 78 3b 0a 0a 20 20 73 71 6c 69 74  r sFix;..  sqlit
7ad0: 65 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  eStartTable(pPar
7ae0: 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d  se, pBegin, pNam
7af0: 65 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  e, isTemp, 1);. 
7b00: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7b10: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7b20: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
7b30: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
7b40: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
7b50: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
7b60: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  n;.  }.  if( sql
7b70: 69 74 65 46 69 78 49 6e 69 74 28 26 73 46 69 78  iteFixInit(&sFix
7b80: 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62  , pParse, p->iDb
7b90: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
7ba0: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69  .    && sqliteFi
7bb0: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
7bc0: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
7bd0: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
7be0: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
7bf0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
7c00: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
7c10: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
7c20: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
7c30: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
7c40: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
7c50: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
7c60: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
7c70: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
7c80: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
7c90: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
7ca0: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
7cb0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
7cc0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
7cd0: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
7ce0: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
7cf0: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
7d00: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
7d10: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
7d20: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7d30: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
7d40: 74 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65  t);.  sqliteSele
7d50: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
7d60: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
7d70: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
7d80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 69 65  ){.    sqliteVie
7d90: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
7da0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
7db0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
7dc0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
7dd0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
7de0: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
7df0: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
7e00: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
7e10: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
7e20: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
7e30: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
7e40: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
7e50: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
7e60: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
7e70: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
7e80: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
7e90: 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
7ea0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
7eb0: 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c  & (z[n-1]==';' |
7ec0: 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  | isspace(z[n-1]
7ed0: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  )) ){ n--; }.  s
7ee0: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
7ef0: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
7f00: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 45    /* Use sqliteE
7f10: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
7f20: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
7f30: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
7f40: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
7f50: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
7f60: 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65   &sEnd, 0);.  re
7f70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
7f80: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
7f90: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
7fa0: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
7fb0: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
7fc0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
7fd0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
7fe0: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
7ff0: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
8000: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
8010: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
8020: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
8030: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
8040: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
8050: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
8060: 6c 69 74 65 56 69 65 77 47 65 74 43 6f 6c 75 6d  liteViewGetColum
8070: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
8080: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
8090: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
80a0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
80b0: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
80c0: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
80d0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
80e0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
80f0: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
8100: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
8110: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
8120: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
8130: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
8140: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
8150: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
8160: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
8170: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
8180: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
8190: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
81a0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
81b0: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
81c0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
81d0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
81e0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
81f0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
8200: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
8210: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
8220: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
8230: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
8240: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
8250: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
8260: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
8270: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
8280: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
8290: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
82a0: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
82b0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
82c0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
82d0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
82e0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
82f0: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
8300: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
8310: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
8320: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
8330: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
8340: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
8350: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
8360: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
8370: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
8380: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
8390: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
83a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
83b0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
83c0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
83d0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
83e0: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
83f0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
8400: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
8410: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
8420: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
8430: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
8440: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
8450: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
8460: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
8470: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
8480: 6c 20 74 6f 20 73 71 6c 69 74 65 52 65 73 75 6c  l to sqliteResul
8490: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
84a0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
84b0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
84c0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
84d0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
84e0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
84f0: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
8500: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
8510: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
8520: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
8530: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
8540: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
8550: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
8560: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
8570: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
8580: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
8590: 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69  ExprListDup(pELi
85a0: 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d  st);.  if( pSel-
85b0: 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  >pEList==0 ){.  
85c0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
85d0: 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74   pEList;.    ret
85e0: 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  urn 1;  /* Mallo
85f0: 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  c failed */.  }.
8600: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
8610: 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d   -1;.  pSelTab =
8620: 20 73 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74   sqliteResultSet
8630: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
8640: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
8650: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
8660: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
8670: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
8680: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
8690: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
86a0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
86b0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
86c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
86d0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
86e0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
86f0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62   sqliteDeleteTab
8700: 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a  le(0, pSelTab);.
8710: 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
8720: 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  y(pParse->db, pT
8730: 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e  able->iDb, DB_Un
8740: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d  resetViews);.  }
8750: 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65  else{.    pTable
8760: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
8770: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  nErr++;.  }.  sq
8780: 6c 69 74 65 53 65 6c 65 63 74 55 6e 62 69 6e 64  liteSelectUnbind
8790: 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (pSel);.  sqlite
87a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
87b0: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
87c0: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
87d0: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
87e0: 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr;  .}../*.**
87f0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
8800: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
8810: 20 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a   VIEW pTable..**
8820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8830: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
8840: 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61  ver any other ta
8850: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d  ble or view is m
8860: 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20  odified..** The 
8870: 76 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f  view passed into
8880: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
8890: 67 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63  ght depend direc
88a0: 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c  tly or indirectl
88b0: 79 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69  y.** on the modi
88c0: 66 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  fied or deleted 
88d0: 74 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64  table so we need
88e0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c   to clear the ol
88f0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65  d column.** name
8900: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77  s so that they w
8910: 69 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65  ill be recompute
8920: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8930: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
8940: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
8950: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
8960: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
8970: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
8980: 70 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61  pTable!=0 && pTa
8990: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  ble->pSelect!=0 
89a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
89b0: 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  ol=pTable->aCol;
89c0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
89d0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
89e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
89f0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
8a00: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
8a10: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  >zDflt);.    sql
8a20: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
8a30: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
8a40: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
8a50: 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Col);.  pTable->
8a60: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
8a70: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
8a80: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
8a90: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
8aa0: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
8ab0: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
8ac0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
8ad0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
8ae0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
8af0: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
8b00: 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48  m *i;.  if( !DbH
8b10: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
8b20: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
8b30: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
8b40: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
8b50: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
8b60: 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69  idx].tblHash); i
8b70: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
8b80: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
8b90: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
8ba0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
8bb0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
8bc0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
8bd0: 74 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d  teViewResetColum
8be0: 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20  nNames(pTab);.  
8bf0: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
8c00: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
8c10: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
8c20: 77 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ws);.}../*.** Gi
8c30: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f  ven a token, loo
8c40: 6b 20 75 70 20 61 20 74 61 62 6c 65 20 77 69 74  k up a table wit
8c50: 68 20 74 68 61 74 20 6e 61 6d 65 2e 20 20 49 66  h that name.  If
8c60: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c 65 61 76   not found, leav
8c70: 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 66 6f  e.** an error fo
8c80: 72 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  r the parser to 
8c90: 66 69 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  find and return 
8ca0: 4e 55 4c 4c 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  NULL..*/.Table *
8cb0: 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d 54  sqliteTableFromT
8cc0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
8cd0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29  se, Token *pTok)
8ce0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
8cf0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
8d00: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8d10: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
8d20: 65 6e 28 70 54 6f 6b 29 3b 0a 20 20 69 66 28 20  en(pTok);.  if( 
8d30: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
8d40: 6e 20 30 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  n 0;.  pTab = sq
8d50: 6c 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 50  liteFindTable(pP
8d60: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
8d70: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
8d80: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
8d90: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
8da0: 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50  qliteErrorMsg(pP
8db0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
8dc0: 61 62 6c 65 3a 20 25 54 22 2c 20 70 54 6f 6b 29  able: %T", pTok)
8dd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8de0: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Tab;.}../*.** Th
8df0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8e00: 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
8e10: 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
8e20: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8e30: 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
8e40: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
8e50: 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
8e60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 44 72  */.void sqliteDr
8e70: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
8e80: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8e90: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 29  ame, int isView)
8ea0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
8eb0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
8ec0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
8ed0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
8ee0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
8ef0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
8f00: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d 61  Err || sqlite_ma
8f10: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
8f20: 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d  turn;.  pTable =
8f30: 20 73 71 6c 69 74 65 54 61 62 6c 65 46 72 6f 6d   sqliteTableFrom
8f40: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 70 4e  Token(pParse, pN
8f50: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
8f60: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
8f70: 20 20 69 44 62 20 3d 20 70 54 61 62 6c 65 2d 3e    iDb = pTable->
8f80: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
8f90: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
8fa0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
8fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
8fc0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
8fd0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
8fe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
8ff0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
9000: 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20  pTable->iDb);.  
9010: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
9020: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
9030: 6c 65 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  le->iDb].zName;.
9040: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41 75      if( sqliteAu
9050: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
9060: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
9070: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
9080: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9090: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
90a0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
90b0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
90c0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
90d0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
90e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
90f0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
9100: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
9110: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9120: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
9130: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
9140: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
9150: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
9160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9170: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
9180: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
9190: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
91a0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
91b0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
91c0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  able->zName, 0, 
91d0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 72 65  zDb) ){.      re
91e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
91f0: 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68  if( sqliteAuthCh
9200: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
9210: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 6c  TE_DELETE, pTabl
9220: 65 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e->zName, 0, zDb
9230: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
9240: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
9250: 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 6c 65  dif.  if( pTable
9260: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
9270: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
9280: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
9290: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
92a0: 6f 70 70 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  opped", pTable->
92b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72  zName);.    pPar
92c0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
92d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
92e0: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
92f0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  le->pSelect==0 )
9300: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
9310: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
9320: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
9330: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
9340: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
9350: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9360: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
9370: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
9380: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
9390: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
93a0: 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
93b0: 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
93c0: 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  s", pTable->zNam
93d0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
93e0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
93f0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
9400: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
9410: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
9420: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
9430: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
9440: 65 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  eGetVdbe(pParse)
9450: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
9460: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
9470: 73 74 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d  st dropTable[] =
9480: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
9490: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
94a0: 52 28 38 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20  R(8),  0},.     
94b0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
94c0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
94d0: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
94e0: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
94f0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
9500: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  },.      { OP_Me
9510: 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20  mLoad,    1, 0, 
9520: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
9530: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
9540: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20  lumn,     0, 2, 
9550: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
9560: 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20   { OP_Ne,       
9570: 20 20 30 2c 20 41 44 44 52 28 37 29 2c 20 20 30    0, ADDR(7),  0
9580: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
9590: 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
95a0: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
95b0: 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
95c0: 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30    0, ADDR(3),  0
95d0: 7d 2c 20 2f 2a 20 37 20 2a 2f 0a 20 20 20 20 7d  }, /* 7 */.    }
95e0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
95f0: 78 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  x;.    Trigger *
9600: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71  pTrigger;.    sq
9610: 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70  liteBeginWriteOp
9620: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
9630: 30 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 29 3b  0, pTable->iDb);
9640: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
9650: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
9660: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
9670: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
9680: 65 64 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67  ed */.    pTrigg
9690: 65 72 20 3d 20 70 54 61 62 6c 65 2d 3e 70 54 72  er = pTable->pTr
96a0: 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65  igger;.    while
96b0: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
96c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
96d0: 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 6c  gger->iDb==pTabl
96e0: 65 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67  e->iDb || pTrigg
96f0: 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20  er->iDb==1 );.  
9700: 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54 72      sqliteDropTr
9710: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
9720: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
9730: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
9740: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
9750: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
9760: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
9770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9780: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
9790: 70 54 61 62 6c 65 2d 3e 70 54 72 69 67 67 65 72  pTable->pTrigger
97a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
97b0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
97c0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 65   SQLITE_MASTER e
97d0: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
97e0: 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  r to the table *
97f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 4f 70 65 6e  /.    sqliteOpen
9800: 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
9810: 54 61 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20  Table->iDb);.   
9820: 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64   base = sqliteVd
9830: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
9840: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
9850: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
9860: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
9870: 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b  hangeP3(v, base+
9880: 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  1, pTable->zName
9890: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72  , 0);..    /* Dr
98a0: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 54 45  op all SQLITE_TE
98b0: 4d 50 5f 4d 41 53 54 45 52 20 65 6e 74 72 69 65  MP_MASTER entrie
98c0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
98d0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
98e0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44 62   if( pTable->iDb
98f0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
9900: 69 74 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  iteOpenMasterTab
9910: 6c 65 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  le(v, 1);.      
9920: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 56 64 62  base = sqliteVdb
9930: 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72  eAddOpList(v, Ar
9940: 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62 6c  raySize(dropTabl
9950: 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b 0a  e), dropTable);.
9960: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
9970: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
9980: 2b 31 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  +1, pTable->zNam
9990: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 0);.    }..  
99a0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 69 44    if( pTable->iD
99b0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  b==0 ){.      sq
99c0: 6c 69 74 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65  liteChangeCookie
99d0: 28 64 62 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  (db, v);.    }. 
99e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
99f0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
9a00: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21  0, 0);.    if( !
9a10: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
9a20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
9a30: 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70  v, OP_Destroy, p
9a40: 54 61 62 6c 65 2d 3e 74 6e 75 6d 2c 20 70 54 61  Table->tnum, pTa
9a50: 62 6c 65 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20  ble->iDb);.     
9a60: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 6c 65   for(pIdx=pTable
9a70: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9a80: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9a90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9aa0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
9ab0: 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e  _Destroy, pIdx->
9ac0: 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29  tnum, pIdx->iDb)
9ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9ae0: 20 20 20 20 73 71 6c 69 74 65 45 6e 64 57 72 69      sqliteEndWri
9af0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
9b00: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
9b10: 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
9b20: 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
9b30: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
9b40: 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
9b50: 6e 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74  n: if the SQL st
9b60: 61 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69  atement began wi
9b70: 74 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  th the EXPLAIN k
9b80: 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65  eyword,.  ** the
9b90: 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f  n no changes sho
9ba0: 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  uld be made..  *
9bb0: 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
9bc0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
9bd0: 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44  sqliteUnlinkAndD
9be0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
9bf0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 64 62 2d 3e  Table);.    db->
9c00: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
9c10: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
9c20: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
9c30: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
9c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9c50: 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63  routine construc
9c60: 74 73 20 61 20 50 33 20 73 74 72 69 6e 67 20 73  ts a P3 string s
9c70: 75 69 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 4f  uitable for an O
9c80: 50 5f 4d 61 6b 65 49 64 78 4b 65 79 0a 2a 2a 20  P_MakeIdxKey.** 
9c90: 6f 70 63 6f 64 65 20 61 6e 64 20 61 64 64 73 20  opcode and adds 
9ca0: 74 68 61 74 20 50 33 20 73 74 72 69 6e 67 20 74  that P3 string t
9cb0: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
9cc0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
9cd0: 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  truction.** in t
9ce0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
9cf0: 6e 65 2e 20 20 54 68 65 20 50 33 20 73 74 72 69  ne.  The P3 stri
9d00: 6e 67 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ng consists of a
9d10: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
9d20: 72 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f  r.** for each co
9d30: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  lumn in the inde
9d40: 78 20 70 49 64 78 20 6f 66 20 74 61 62 6c 65 20  x pIdx of table 
9d50: 70 54 61 62 2e 20 20 49 66 20 74 68 65 20 63 6f  pTab.  If the co
9d60: 6c 75 6d 6e 20 75 73 65 73 0a 2a 2a 20 61 20 6e  lumn uses.** a n
9d70: 75 6d 65 72 69 63 20 73 6f 72 74 20 6f 72 64 65  umeric sort orde
9d80: 72 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20 73  r, then the P3 s
9d90: 74 72 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  tring character 
9da0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
9db0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  .** that column 
9dc0: 69 73 20 27 6e 27 2e 20 20 49 66 20 74 68 65 20  is 'n'.  If the 
9dd0: 63 6f 6c 75 6d 6e 20 75 73 65 73 20 61 20 74 65  column uses a te
9de0: 78 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 74  xt sort order, t
9df0: 68 65 6e 20 74 68 65 0a 2a 2a 20 50 33 20 73 74  hen the.** P3 st
9e00: 72 69 6e 67 20 69 73 20 27 74 27 2e 20 20 53 65  ring is 't'.  Se
9e10: 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 49 64 78  e the OP_MakeIdx
9e20: 4b 65 79 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d  Key opcode docum
9e30: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  entation for.** 
9e40: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
9e50: 6d 61 74 69 6f 6e 2e 20 20 53 65 65 20 61 6c 73  mation.  See als
9e60: 6f 20 74 68 65 20 73 71 6c 69 74 65 41 64 64 4b  o the sqliteAddK
9e70: 65 79 54 79 70 65 28 29 20 72 6f 75 74 69 6e 65  eyType() routine
9e80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9e90: 41 64 64 49 64 78 4b 65 79 54 79 70 65 28 56 64  AddIdxKeyType(Vd
9ea0: 62 65 20 2a 76 2c 20 49 6e 64 65 78 20 2a 70 49  be *v, Index *pI
9eb0: 64 78 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 79  dx){.  char *zTy
9ec0: 70 65 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  pe;.  Table *pTa
9ed0: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  b;.  int i, n;. 
9ee0: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
9ef0: 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
9f00: 21 3d 30 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  !=0 );.  pTab = 
9f10: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
9f20: 6e 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  n = pIdx->nColum
9f30: 6e 3b 0a 20 20 7a 54 79 70 65 20 3d 20 73 71 6c  n;.  zType = sql
9f40: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b  iteMallocRaw( n+
9f50: 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65  1 );.  if( zType
9f60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9f70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
9f80: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
9f90: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
9fa0: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
9fb0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
9fc0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  l<pTab->nCol );.
9fd0: 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61      if( (pTab->a
9fe0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 6f 72 74 4f 72  Col[iCol].sortOr
9ff0: 64 65 72 20 26 20 53 51 4c 49 54 45 5f 53 4f 5f  der & SQLITE_SO_
a000: 54 59 50 45 4d 41 53 4b 29 3d 3d 53 51 4c 49 54  TYPEMASK)==SQLIT
a010: 45 5f 53 4f 5f 54 45 58 54 20 29 7b 0a 20 20 20  E_SO_TEXT ){.   
a020: 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27 74     zType[i] = 't
a030: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ';.    }else{.  
a040: 20 20 20 20 7a 54 79 70 65 5b 69 5d 20 3d 20 27      zType[i] = '
a050: 6e 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n';.    }.  }.  
a060: 7a 54 79 70 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zType[n] = 0;.  
a070: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
a080: 50 33 28 76 2c 20 2d 31 2c 20 7a 54 79 70 65 2c  P3(v, -1, zType,
a090: 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   n);.  sqliteFre
a0a0: 65 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(zType);.}../*.
a0b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a0c0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
a0d0: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
a0e0: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
a0f0: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
a100: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a110: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
a120: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
a130: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
a140: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
a150: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
a160: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
a170: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
a180: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
a190: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
a1a0: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
a1b0: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
a1c0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
a1d0: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
a1e0: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
a1f0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
a200: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
a210: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
a220: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
a230: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
a240: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
a250: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
a260: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
a270: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
a280: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
a290: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
a2a0: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
a2b0: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
a2c0: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
a2d0: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
a2e0: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
a2f0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
a300: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
a310: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
a320: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a330: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
a340: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
a350: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
a360: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
a370: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
a380: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
a390: 74 69 6c 20 73 71 6c 69 74 65 45 6e 64 54 61 62  til sqliteEndTab
a3a0: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
a3b0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
a3c0: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
a3d0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
a3e0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
a3f0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 44 65 66 65  ** to sqliteDefe
a400: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
a410: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
a420: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
a430: 76 6f 69 64 20 73 71 6c 69 74 65 43 72 65 61 74  void sqliteCreat
a440: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
a450: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a460: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a470: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 64 4c 69  ontext */.  IdLi
a480: 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 20  st *pFromCol,   
a490: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
a4a0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
a4b0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
a4c0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
a4d0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
a4e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
a4f0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 49 64  er table */.  Id
a500: 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
a510: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
a520: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
a530: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
a540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
a550: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
a560: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
a570: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  .){.  Table *p =
a580: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a590: 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
a5a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a5b0: 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
a5c0: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
a5d0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
a5e0: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
a5f0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
a600: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
a610: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
a620: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
a630: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
a640: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
a650: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
a660: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
a670: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 31  & pToCol->nId!=1
a680: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a690: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a6a0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
a6b0: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
a6c0: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
a6d0: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
a6e0: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
a6f0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
a700: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
a710: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
a720: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
a730: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
a740: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
a750: 70 54 6f 43 6f 6c 2d 3e 6e 49 64 21 3d 70 46 72  pToCol->nId!=pFr
a760: 6f 6d 43 6f 6c 2d 3e 6e 49 64 20 29 7b 0a 20 20  omCol->nId ){.  
a770: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
a780: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
a790: 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
a7a0: 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
a7b0: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
a7c0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
a7d0: 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
a7e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
a7f0: 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
a800: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
a810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
a820: 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 49 64   = pFromCol->nId
a830: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a840: 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
a850: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b   nCol*sizeof(pFK
a860: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
a870: 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
a880: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
a890: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
a8a0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
a8b0: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
a8c0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
a8d0: 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
a8e0: 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
a8f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42  sqliteMalloc( nB
a900: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
a910: 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f  ey==0 ) goto fk_
a920: 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46  end;.  pFKey->pF
a930: 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
a940: 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
a950: 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
a960: 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
a970: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
a980: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
a990: 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
a9a0: 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
a9b0: 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
a9c0: 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
a9d0: 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
a9e0: 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
a9f0: 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
aa00: 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
aa10: 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
aa20: 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
aa30: 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
aa40: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
aa50: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
aa60: 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
aa70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
aa80: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
aa90: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
aaa0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
aab0: 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
aac0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
aad0: 69 74 65 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  iteStrICmp(p->aC
aae0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
aaf0: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
ab00: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ab10: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
ab20: 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
ab30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ab50: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
ab60: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
ab70: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
ab80: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
ab90: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
aba0: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
abb0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
abc0: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
abd0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
abe0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
abf0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
ac00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ac10: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
ac20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
ac30: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
ac40: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
ac50: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
ac60: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
ac70: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
ac80: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
ac90: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
aca0: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
acb0: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
acc0: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
acd0: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
ace0: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
acf0: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
ad00: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
ad10: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
ad20: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
ad30: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
ad40: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
ad50: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
ad60: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
ad70: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
ad80: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
ad90: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
ada0: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
adb0: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
adc0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
add0: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
ade0: 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  pFKey);.  sqlite
adf0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  IdListDelete(pFr
ae00: 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
ae10: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f  IdListDelete(pTo
ae20: 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
ae30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ae40: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
ae50: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
ae60: 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
ae70: 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
ae80: 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
ae90: 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
aea0: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
aeb0: 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
aec0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
aed0: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
aee0: 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
aef0: 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
af00: 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
af10: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
af20: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
af30: 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
af40: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
af50: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
af60: 6f 69 64 20 73 71 6c 69 74 65 44 65 66 65 72 46  oid sqliteDeferF
af70: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
af80: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
af90: 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61 62 6c  eferred){.  Tabl
afa0: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
afb0: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
afc0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
afd0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
afe0: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
aff0: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
b000: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
b010: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
b020: 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ed;.}../*.** Cre
b030: 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
b040: 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
b050: 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65  .  pIndex is the
b060: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
b070: 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c  ex .** and pTabl
b080: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
b090: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
b0a0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
b0b0: 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
b0c0: 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
b0d0: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
b0e0: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
b0f0: 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
b100: 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
b110: 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
b120: 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
b130: 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
b140: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
b150: 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
b160: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
b170: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b180: 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
b190: 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
b1a0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
b1b0: 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
b1c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
b1d0: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
b1e0: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
b1f0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
b200: 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
b210: 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
b220: 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
b230: 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
b240: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
b250: 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
b260: 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
b270: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
b280: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b290: 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
b2a0: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
b2b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b2c0: 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72  ,   /* All infor
b2d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
b2e0: 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
b2f0: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 2f 2a  en *pName,    /*
b300: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
b310: 65 78 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ex.  May be NULL
b320: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
b330: 54 61 62 6c 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Table, /* Name o
b340: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69  f the table to i
b350: 6e 64 65 78 2e 20 20 55 73 65 20 70 50 61 72 73  ndex.  Use pPars
b360: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
b370: 30 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  0 */.  IdList *p
b380: 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
b390: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
b3a0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
b3b0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
b3c0: 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
b3d0: 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
b3e0: 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
b3f0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
b400: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45  rt,   /* The CRE
b410: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
b420: 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54  egins a CREATE T
b430: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  ABLE statement *
b440: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20  /.  Token *pEnd 
b450: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
b460: 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
b470: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
b480: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54  tement */.){.  T
b490: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
b4a0: 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
b4b0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
b4c0: 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 2f 2a 20  x *pIndex;   /* 
b4d0: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
b4e0: 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
b4f0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
b500: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
b510: 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20  n nullId;    /* 
b520: 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
b530: 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
b540: 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
b550: 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73  x;    /* For ass
b560: 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
b570: 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
b580: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b  */.  int isTemp;
b590: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
b5a0: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e  r a temporary in
b5b0: 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20  dex */.  sqlite 
b5c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b5d0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
b5e0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f  >nErr || sqlite_
b5f0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
b600: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
b610: 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 64 62  _index;.  if( db
b620: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 0a 20 20 20  ->init.busy .   
b630: 20 20 26 26 20 73 71 6c 69 74 65 46 69 78 49 6e    && sqliteFixIn
b640: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
b650: 2c 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 2c 20  , db->init.iDb, 
b660: 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 0a  "index", pName).
b670: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 46 69       && sqliteFi
b680: 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
b690: 70 54 61 62 6c 65 29 0a 20 20 29 7b 0a 20 20 20  pTable).  ){.   
b6a0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
b6b0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
b6c0: 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
b6d0: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
b6e0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
b6f0: 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
b700: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
b710: 20 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29   if( pTable!=0 )
b720: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
b730: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame!=0 );.    as
b740: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 53  sert( pTable->nS
b750: 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  rc==1 );.    pTa
b760: 62 20 3d 20 20 73 71 6c 69 74 65 53 72 63 4c 69  b =  sqliteSrcLi
b770: 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
b780: 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
b790: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
b7a0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
b7b0: 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70  Tab =  pParse->p
b7c0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
b7d0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
b7e0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
b7f0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
b800: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
b810: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
b820: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
b830: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
b840: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
b850: 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
b860: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
b870: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
b880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
b890: 2d 3e 69 44 62 3e 3d 32 20 26 26 20 64 62 2d 3e  ->iDb>=2 && db->
b8a0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
b8b0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
b8c0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
b8d0: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 68 61 76  e %s may not hav
b8e0: 65 20 69 6e 64 69 63 65 73 20 61 64 64 65 64 22  e indices added"
b8f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
b900: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
b910: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
b920: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
b930: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
b940: 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  eErrorMsg(pParse
b950: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
b960: 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
b970: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
b980: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
b990: 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
b9a0: 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20  iDb==1;..  /*.  
b9b0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
b9c0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
b9d0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
b9e0: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
b9f0: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
ba00: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
ba10: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
ba20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
ba30: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
ba40: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
ba50: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
ba60: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
ba70: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
ba80: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
ba90: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
baa0: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
bab0: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
bac0: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
bad0: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
bae0: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
baf0: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
bb00: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
bb10: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
bb20: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
bb30: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
bb40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
bb50: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
bb60: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
bb70: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
bb80: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
bb90: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
bba0: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
bbb0: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
bbc0: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
bbd0: 69 66 28 20 70 4e 61 6d 65 20 26 26 20 21 64 62  if( pName && !db
bbe0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
bbf0: 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65     Index *pISame
bc00: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74  Name;    /* Anot
bc10: 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74  her index with t
bc20: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  he same name */.
bc30: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
bc40: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
bc50: 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
bc60: 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
bc70: 20 2a 2f 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   */.    zName = 
bc80: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
bc90: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
bca0: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
bcb0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
bcc0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
bcd0: 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
bce0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
bcf0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
bd00: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
bd10: 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72  iteErrorMsg(pPar
bd20: 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
bd30: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
bd40: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
bd50: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
bd60: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
bd70: 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
bd80: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
bd90: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21  (db, zName, 0))!
bda0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
bdb0: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
bdc0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
bdd0: 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
bde0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
bdf0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
be00: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
be10: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
be20: 70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pName==0 ){.    
be30: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
be40: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
be50: 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
be60: 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
be70: 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
be80: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
be90: 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
bea0: 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c     sprintf(zBuf,
beb0: 22 25 64 29 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "%d)",n);.    zN
bec0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
bed0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  iteSetString(&zN
bee0: 61 6d 65 2c 20 22 28 22 2c 20 70 54 61 62 2d 3e  ame, "(", pTab->
bef0: 7a 4e 61 6d 65 2c 20 22 20 61 75 74 6f 69 6e 64  zName, " autoind
bf00: 65 78 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61  ex ", zBuf, (cha
bf10: 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  r*)0);.    if( z
bf20: 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
bf30: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
bf40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
bf50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
bf60: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
bf70: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7d 0a 0a 20  Name->n);.  }.. 
bf80: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
bf90: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
bfa0: 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
bfb0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
bfc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
bfd0: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
bfe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
bff0: 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69   db->aDb[pTab->i
c000: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  Db].zName;..    
c010: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 44  assert( pTab->iD
c020: 62 3d 3d 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20  b==db->init.iDb 
c030: 7c 7c 20 69 73 54 65 6d 70 20 29 3b 0a 20 20 20  || isTemp );.   
c040: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
c050: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
c060: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
c070: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
c080: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
c090: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
c0a0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
c0b0: 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
c0c0: 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
c0d0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
c0e0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
c0f0: 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
c100: 20 69 66 28 20 73 71 6c 69 74 65 41 75 74 68 43   if( sqliteAuthC
c110: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
c120: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
c130: 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
c140: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
c150: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
c160: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
c170: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
c180: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
c190: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
c1a0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
c1b0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
c1c0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
c1d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
c1e0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
c1f0: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
c200: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
c210: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
c220: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
c230: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
c240: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
c250: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
c260: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
c270: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
c280: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
c290: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 49 64  pList = sqliteId
c2a0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 26 6e  ListAppend(0, &n
c2b0: 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
c2c0: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
c2d0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
c2e0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20  x;.  }..  /* .  
c2f0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
c300: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
c310: 20 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20   .  */.  pIndex 
c320: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
c330: 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
c340: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20  strlen(zName) + 
c350: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1 +.            
c360: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
c370: 6f 66 28 69 6e 74 29 2a 70 4c 69 73 74 2d 3e 6e  of(int)*pList->n
c380: 49 64 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  Id );.  if( pInd
c390: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
c3a0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
c3b0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
c3c0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
c3d0: 65 78 5b 31 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  ex[1];.  pIndex-
c3e0: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
c3f0: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
c400: 6e 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 3b 0a 20  n[pList->nId];. 
c410: 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e   strcpy(pIndex->
c420: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  zName, zName);. 
c430: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
c440: 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
c450: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
c460: 74 2d 3e 6e 49 64 3b 0a 20 20 70 49 6e 64 65 78  t->nId;.  pIndex
c470: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
c480: 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
c490: 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
c4a0: 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  ==0;.  pIndex->i
c4b0: 44 62 20 3d 20 69 73 54 65 6d 70 20 3f 20 31 20  Db = isTemp ? 1 
c4c0: 3a 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  : db->init.iDb;.
c4d0: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
c4e0: 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
c4f0: 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
c500: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
c510: 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
c520: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
c530: 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
c540: 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
c550: 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
c560: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
c570: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
c580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
c590: 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
c5a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
c5b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
c5c0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
c5d0: 65 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  eStrICmp(pList->
c5e0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
c5f0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
c600: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
c610: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
c620: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
c630: 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67    sqliteErrorMsg
c640: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
c650: 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
c660: 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
c670: 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
c680: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
c690: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
c6a0: 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20  eFree(pIndex);. 
c6b0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
c6c0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
c6d0: 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
c6e0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a  iColumn[i] = j;.
c6f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
c700: 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
c710: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
c720: 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
c730: 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
c740: 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
c750: 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
c760: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
c770: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64  plain ){.    Ind
c780: 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
c790: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
c7a0: 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d  &db->aDb[pIndex-
c7b0: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a  >iDb].idxHash, .
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
c7e0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
c7f0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  Index->zName)+1,
c800: 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
c810: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
c820: 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
c830: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
c840: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
c850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
c860: 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e(pIndex);.     
c870: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
c880: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
c890: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
c8a0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
c8b0: 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nges;.  }..  /* 
c8c0: 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
c8d0: 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
c8e0: 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
c8f0: 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
c900: 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
c910: 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
c920: 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
c930: 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
c940: 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
c950: 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
c960: 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
c970: 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
c980: 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
c990: 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
c9a0: 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d  .  if( onError!=
c9b0: 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
c9c0: 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
c9d0: 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
c9e0: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
c9f0: 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
ca00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
ca10: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
ca20: 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
ca30: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65   pIndex;.  }else
ca40: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74  {.    Index *pOt
ca50: 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
ca60: 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ex;.    while( p
ca70: 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
ca80: 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
ca90: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
caa0: 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68  ce ){.      pOth
cab0: 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
cac0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  xt;.    }.    pI
cad0: 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
cae0: 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
caf0: 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
cb00: 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20   pIndex;.  }..  
cb10: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
cb20: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
cb30: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
cb40: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
cb50: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
cb60: 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  e_master" table 
cb70: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f  on the disk.  So
cb80: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
cb90: 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61   the disk.  ** a
cba0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
cbb0: 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  he table number 
cbc0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
cbd0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
cbe0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
cbf0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 54 61  init.busy && pTa
cc00: 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49  ble!=0 ){.    pI
cc10: 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
cc20: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
cc30: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
cc40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
cc50: 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
cc60: 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
cc70: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
cc80: 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
cc90: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
cca0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
ccb0: 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
ccc0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
ccd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
cce0: 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
ccf0: 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
cd00: 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
cd10: 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
cd20: 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
cd30: 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
cd40: 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
cd50: 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
cd60: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
cd70: 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
cd80: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
cd90: 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
cda0: 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
cdb0: 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
cdc0: 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
cdd0: 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
cde0: 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
cdf0: 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
ce00: 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
ce10: 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
ce20: 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
ce30: 20 70 54 61 62 6c 65 3d 3d 30 20 69 74 20 6d 65   pTable==0 it me
ce40: 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
ce50: 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
ce60: 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
ce70: 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
ce80: 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
ce90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
cea0: 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
ceb0: 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
cec0: 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
ced0: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
cee0: 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
cef0: 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
cf00: 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
cf10: 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
cf20: 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
cf30: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
cf40: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
cf50: 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
cf60: 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 20 20 20 20  lbl1, lbl2;.    
cf70: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
cf80: 64 64 72 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  ddr;..    v = sq
cf90: 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61 72  liteGetVdbe(pPar
cfa0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
cfb0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
cfc0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
cfd0: 69 66 28 20 70 54 61 62 6c 65 21 3d 30 20 29 7b  if( pTable!=0 ){
cfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 65 67  .      sqliteBeg
cff0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
d000: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 73 54 65  (pParse, 0, isTe
d010: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
d020: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
d030: 28 76 2c 20 69 73 54 65 6d 70 29 3b 0a 20 20 20  (v, isTemp);.   
d040: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
d050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
d060: 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  Recno, 0, 0);.  
d070: 20 20 73 71 6c 69 74 65 56 64 62 65 4f 70 33 28    sqliteVdbeOp3(
d080: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
d090: 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f   0, "index", P3_
d0a0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
d0b0: 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  iteVdbeOp3(v, OP
d0c0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 70  _String, 0, 0, p
d0d0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
d0e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
d0f0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
d100: 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
d110: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
d120: 69 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  iteVdbeOp3(v, OP
d130: 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c  _CreateIndex, 0,
d140: 20 69 73 54 65 6d 70 2c 28 63 68 61 72 2a 29 26   isTemp,(char*)&
d150: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f  pIndex->tnum,P3_
d160: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49  POINTER);.    pI
d170: 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a  ndex->tnum = 0;.
d180: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
d190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  {.      sqliteVd
d1a0: 62 65 43 6f 64 65 28 76 2c 0a 20 20 20 20 20 20  beCode(v,.      
d1b0: 20 20 20 20 4f 50 5f 44 75 70 2c 20 20 20 20 20      OP_Dup,     
d1c0: 20 20 30 2c 20 20 20 20 20 20 30 2c 0a 20 20 20    0,      0,.   
d1d0: 20 20 20 20 20 20 20 4f 50 5f 49 6e 74 65 67 65         OP_Intege
d1e0: 72 2c 20 20 20 69 73 54 65 6d 70 2c 20 30 2c 0a  r,   isTemp, 0,.
d1f0: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4f 70 65            OP_Ope
d200: 6e 57 72 69 74 65 2c 20 31 2c 20 20 20 20 20 20  nWrite, 1,      
d210: 30 2c 0a 20 20 20 20 20 20 30 29 3b 0a 20 20 20  0,.      0);.   
d220: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
d230: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
d240: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
d250: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  );.    if( pStar
d260: 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
d270: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
d280: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 53 74 61  ->z) - Addr(pSta
d290: 72 74 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  rt->z) + 1;.    
d2a0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
d2b0: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 53  geP3(v, addr, pS
d2c0: 74 61 72 74 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20  tart->z, n);.   
d2d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
d2e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
d2f0: 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 29 3b 0a  eRecord, 5, 0);.
d300: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d310: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74  dOp(v, OP_PutInt
d320: 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
d330: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
d340: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
d350: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d360: 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29  r, pTab->iDb, 0)
d370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
d380: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
d390: 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74  Read, 2, pTab->t
d3a0: 6e 75 6d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  num, pTab->zName
d3b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32  , 0);.      lbl2
d3c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
d3d0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d3e0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d3f0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32  (v, OP_Rewind, 2
d400: 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c  , lbl2);.      l
d410: 62 6c 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65  bl1 = sqliteVdbe
d420: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
d430: 6f 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  o, 2, 0);.      
d440: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
d450: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
d460: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
d470: 6f 6c 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  ol = pIndex->aiC
d480: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
d490: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
d4a0: 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20  y==iCol ){.     
d4b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
d4c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d4d0: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  i, 0);.        }
d4e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d4f0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 32 2c  v, OP_Column, 2,
d510: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
d520: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d530: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
d540: 76 2c 20 4f 50 5f 4d 61 6b 65 49 64 78 4b 65 79  v, OP_MakeIdxKey
d550: 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  , pIndex->nColum
d560: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
d570: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
d580: 3e 3d 34 20 29 20 73 71 6c 69 74 65 41 64 64 49  >=4 ) sqliteAddI
d590: 64 78 4b 65 79 54 79 70 65 28 76 2c 20 70 49 6e  dxKeyType(v, pIn
d5a0: 64 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dex);.      sqli
d5b0: 74 65 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  teVdbeOp3(v, OP_
d5c0: 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65  IdxPut, 1, pInde
d5d0: 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
d5e0: 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  one,.           
d5f0: 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65             "inde
d600: 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
d610: 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
d620: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
d630: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
d640: 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
d650: 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l1);.      sqlit
d660: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
d670: 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  l(v, lbl2);.    
d680: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
d690: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32  p(v, OP_Close, 2
d6a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d6b0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
d6c0: 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
d6d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
d6e0: 61 62 6c 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  able!=0 ){.     
d6f0: 20 69 66 28 20 21 69 73 54 65 6d 70 20 29 7b 0a   if( !isTemp ){.
d700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 43 68          sqliteCh
d710: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
d720: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d730: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
d740: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
d750: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d760: 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  eEndWriteOperati
d770: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  on(pParse);.    
d780: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
d790: 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
d7a0: 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
d7b0: 74 65 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  te_index:.  sqli
d7c0: 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  teIdListDelete(p
d7d0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 53  List);.  sqliteS
d7e0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54 61  rcListDelete(pTa
d7f0: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ble);.  sqliteFr
d800: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
d810: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
d820: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
d830: 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
d840: 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
d850: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
d860: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
d870: 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
d880: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
d890: 74 65 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  teDropIndex(Pars
d8a0: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
d8b0: 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
d8c0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
d8d0: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
d8e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d8f0: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
d900: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
d910: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
d920: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
d930: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
d940: 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  1 );.  pIndex = 
d950: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
d960: 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
d970: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
d980: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
d990: 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
d9a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
d9b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
d9c0: 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22   such index: %S"
d9d0: 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , pName, 0);.   
d9e0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
d9f0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
da00: 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
da10: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
da20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
da30: 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
da40: 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
da50: 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
da60: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
da70: 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
da80: 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
da90: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
daa0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
dab0: 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20  ndex->iDb>1 ){. 
dac0: 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d 73     sqliteErrorMs
dad0: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
dae0: 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f  t alter schema o
daf0: 66 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20  f attached ".   
db00: 20 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c      "databases",
db10: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
db20: 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
db30: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
db40: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
db50: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
db60: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
db70: 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
db80: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
db90: 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
dba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
dbb0: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
dbc0: 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
dbd0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
dbe0: 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
dbf0: 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
dc00: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 41  .    if( sqliteA
dc10: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
dc20: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
dc30: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
dc40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
dc50: 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
dc60: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65   }.    if( pInde
dc70: 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d 20  x->iDb ) code = 
dc80: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
dc90: 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
dca0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
dcb0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
dcc0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
dcd0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
dce0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
dcf0: 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
dd00: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
dd10: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
dd20: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
dd30: 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
dd40: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
dd50: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
dd60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
dd70: 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
dd80: 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73  static VdbeOpLis
dd90: 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20  t dropIndex[] = 
dda0: 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77  {.      { OP_Rew
ddb0: 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52  ind,     0, ADDR
ddc0: 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20  (9), 0}, .      
ddd0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
dde0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
ddf0: 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 1 */.      {
de00: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20   OP_MemStore,   
de10: 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a  1, 1,       0},.
de20: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f        { OP_MemLo
de30: 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ad,    1, 0,    
de40: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
de50: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
de60: 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20  ,     0, 1,     
de70: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
de80: 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
de90: 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(8), 0},.   
dea0: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
deb0: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
dec0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47  0},.      { OP_G
ded0: 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44  oto,       0, AD
dee0: 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20  DR(9), 0},.     
def0: 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20   { OP_Delete,   
df00: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
df10: 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b  , /* 8 */.    };
df20: 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a  .    int base;..
df30: 20 20 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57      sqliteBeginW
df40: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
df50: 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d  arse, 0, pIndex-
df60: 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
df70: 65 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  eOpenMasterTable
df80: 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  (v, pIndex->iDb)
df90: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c  ;.    base = sql
dfa0: 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74  iteVdbeAddOpList
dfb0: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
dfc0: 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e  opIndex), dropIn
dfd0: 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
dfe0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
dff0: 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e  base+1, pIndex->
e000: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
e010: 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  f( pIndex->iDb==
e020: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
e030: 65 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  eChangeCookie(db
e040: 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , v);.    }.    
e050: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
e060: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
e070: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
e080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
e090: 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74  stroy, pIndex->t
e0a0: 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
e0b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 45 6e 64  );.    sqliteEnd
e0c0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
e0d0: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
e0e0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
e0f0: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
e100: 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  on of this index
e110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
e120: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
e130: 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e  .    sqliteUnlin
e140: 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
e150: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  db, pIndex);.   
e160: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
e170: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
e180: 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  es;.  }..exit_dr
e190: 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
e1a0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
e1b0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
e1c0: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
e1d0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
e1e0: 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
e1f0: 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
e200: 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
e210: 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
e220: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
e230: 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
e240: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
e250: 69 73 74 20 2a 73 71 6c 69 74 65 49 64 4c 69 73  ist *sqliteIdLis
e260: 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
e270: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
e280: 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
e290: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
e2a0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
e2b0: 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
e2c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
e2d0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
e2e0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
e2f0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
e300: 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
e310: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
e320: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
e330: 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
e340: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
e350: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
e360: 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
e370: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
e380: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
e390: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
e3a0: 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
e3b0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
e3c0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
e3d0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
e3e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
e3f0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
e400: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e410: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e420: 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
e430: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
e440: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
e450: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
e460: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
e470: 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  nId].zName;.    
e480: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
e490: 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
e4a0: 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
e4b0: 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
e4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 49 64 4c  .      sqliteIdL
e4d0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
e4e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
e4f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e500: 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74 65     sqliteDequote
e510: 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
e520: 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
e530: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
e540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
e550: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
e560: 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
e570: 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
e580: 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
e590: 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
e5a0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
e5b0: 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
e5c0: 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
e5d0: 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
e5e0: 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
e5f0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
e600: 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
e610: 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
e620: 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
e630: 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
e640: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
e650: 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
e660: 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
e670: 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
e680: 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
e690: 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
e6a0: 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
e6b0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
e6c0: 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
e6d0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
e6e0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
e6f0: 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
e700: 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
e710: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
e720: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
e730: 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
e740: 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
e750: 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
e760: 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
e770: 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
e780: 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
e790: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
e7a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e7b0: 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
e7c0: 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
e7d0: 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
e7e0: 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
e7f0: 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
e800: 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
e810: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
e820: 20 20 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74     sqliteSrcList
e830: 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a  Append(A,B,0);.*
e840: 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
e850: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
e860: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
e870: 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
e880: 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
e890: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
e8a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53           sqliteS
e8b0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
e8c0: 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
e8d0: 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
e8e0: 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
e8f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
e900: 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
e910: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
e920: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
e930: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
e940: 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
e950: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
e960: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
e970: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
e980: 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
e990: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
e9a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e9b0: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
e9c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 1;.  }.  if( p
e9d0: 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73  List->nSrc>=pLis
e9e0: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  t->nAlloc ){.   
e9f0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
ea00: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
ea10: 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77  c *= 2;.    pNew
ea20: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
ea30: 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  (pList,.        
ea40: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
ea50: 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e  List) + (pList->
ea60: 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
ea70: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b  (pList->a[0]) );
ea80: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
ea90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eaa0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  SrcListDelete(pL
eab0: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
eac0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
ead0: 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pList = pNew;.  
eae0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
eaf0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
eb00: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
eb10: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
eb20: 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
eb30: 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
eb40: 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
eb50: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
eb60: 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
eb70: 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
eb80: 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
eb90: 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
eba0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
ebb0: 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
ebc0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 6c 65    }.  if( pTable
ebd0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
ebe0: 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
ebf0: 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 4e 61 6d 65  ist->nSrc].zName
ec00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e  ;.    sqliteSetN
ec10: 53 74 72 69 6e 67 28 70 7a 2c 20 70 54 61 62 6c  String(pz, pTabl
ec20: 65 2d 3e 7a 2c 20 70 54 61 62 6c 65 2d 3e 6e 2c  e->z, pTable->n,
ec30: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a   0);.    if( *pz
ec40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
ec50: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
ec60: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
ec70: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
ec80: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
ec90: 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20  Dequote(*pz);.  
eca0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44    }.  }.  if( pD
ecb0: 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 63  atabase ){.    c
ecc0: 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73  har **pz = &pLis
ecd0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
ece0: 5d 2e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20  ].zDatabase;.   
ecf0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
ed00: 67 28 70 7a 2c 20 70 44 61 74 61 62 61 73 65 2d  g(pz, pDatabase-
ed10: 3e 7a 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 6e  >z, pDatabase->n
ed20: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  , 0);.    if( *p
ed30: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
ed40: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
ed50: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
ed60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
ed70: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
ed80: 65 44 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20  eDequote(*pz);. 
ed90: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74     }.  }.  pList
eda0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
edb0: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
edc0: 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
edd0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
ede0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
edf0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74  cursors to all t
ee00: 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
ee10: 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
ee20: 65 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  eSrcListAssignCu
ee30: 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
ee40: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
ee50: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
ee60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
ee70: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
ee80: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
ee90: 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a  i].iCursor<0 ){.
eea0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
eeb0: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ].iCursor = pPar
eec0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
eed0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
eee0: 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74  dd an alias to t
eef0: 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69  he last identifi
ef00: 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  er on the given 
ef10: 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e  identifier list.
ef20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53  .*/.void sqliteS
ef30: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
ef40: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
ef50: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
ef60: 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
ef70: 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
ef80: 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
ef90: 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  ->nSrc - 1;.    
efa0: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
efb0: 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  (&pList->a[i].zA
efc0: 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  lias, pToken->z,
efd0: 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a   pToken->n, 0);.
efe0: 20 20 20 20 73 71 6c 69 74 65 44 65 71 75 6f 74      sqliteDequot
eff0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
f000: 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  lias);.  }.}../*
f010: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
f020: 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
f030: 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65  liteIdListDelete
f040: 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
f050: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
f060: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
f070: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
f080: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
f090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
f0a0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
f0b0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
f0c0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
f0d0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
f0e0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
f0f0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
f100: 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
f110: 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
f120: 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
f130: 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
f140: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49  ..*/.int sqliteI
f150: 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
f160: 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
f170: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
f180: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
f190: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
f1a0: 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
f1b0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
f1c0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
f1d0: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
f1e0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
f1f0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
f200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
f210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
f220: 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
f230: 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
f240: 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
f250: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
f260: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
f270: 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
f280: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
f290: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
f2a0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
f2b0: 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
f2c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
f2d0: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44  e(pList->a[i].zD
f2e0: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
f2f0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
f300: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
f310: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
f320: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
f330: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
f340: 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69  a[i].pTab && pLi
f350: 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69  st->a[i].pTab->i
f360: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
f370: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
f380: 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d 3e  Table(0, pList->
f390: 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20 20  a[i].pTab);.    
f3a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 53 65 6c 65  }.    sqliteSele
f3b0: 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  ctDelete(pList->
f3c0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20  a[i].pSelect);. 
f3d0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c     sqliteExprDel
f3e0: 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ete(pList->a[i].
f3f0: 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
f400: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
f410: 73 74 2d 3e 61 5b 69 5d 2e 70 55 73 69 6e 67 29  st->a[i].pUsing)
f420: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
f430: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
f440: 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
f450: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
f460: 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61 6e 73  sqliteBeginTrans
f470: 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
f480: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
f490: 72 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  r){.  sqlite *db
f4a0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
f4b0: 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
f4c0: 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
f4d0: 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
f4e0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
f4f0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
f500: 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  lite_malloc_fail
f510: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
f520: 66 28 20 73 71 6c 69 74 65 41 75 74 68 43 68 65  f( sqliteAuthChe
f530: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
f540: 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
f550: 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
f560: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62  return;.  if( db
f570: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
f580: 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  _InTrans ){.    
f590: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
f5a0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 73  Parse, "cannot s
f5b0: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
f5c0: 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
f5d0: 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 72  saction");.    r
f5e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
f5f0: 69 74 65 42 65 67 69 6e 57 72 69 74 65 4f 70 65  iteBeginWriteOpe
f600: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
f610: 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 70 50 61  , 0);.  if( !pPa
f620: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
f630: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
f640: 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b   SQLITE_InTrans;
f650: 0a 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  .    db->onError
f660: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a   = onError;.  }.
f670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
f680: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
f690: 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 6d  .void sqliteComm
f6a0: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
f6b0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
f6c0: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69  sqlite *db;..  i
f6d0: 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
f6e0: 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
f6f0: 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
f700: 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
f710: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
f720: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 5f 6d  nErr || sqlite_m
f730: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
f740: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
f750: 69 74 65 41 75 74 68 43 68 65 63 6b 28 70 50 61  iteAuthCheck(pPa
f760: 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
f770: 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
f780: 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
f790: 6e 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  n;.  if( (db->fl
f7a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
f7b0: 72 61 6e 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  rans)==0 ){.    
f7c0: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
f7d0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 63  Parse, "cannot c
f7e0: 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73  ommit - no trans
f7f0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
f800: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
f810: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72 73    }.  if( !pPars
f820: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
f830: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
f840: 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a  SQLITE_InTrans;.
f850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 45 6e 64 57    }.  sqliteEndW
f860: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
f870: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 70 50  arse);.  if( !pP
f880: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
f890: 0a 20 20 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72  .    db->onError
f8a0: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20   = OE_Default;. 
f8b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c   }.}../*.** Roll
f8c0: 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
f8d0: 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
f8e0: 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  eRollbackTransac
f8f0: 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
f900: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
f910: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
f920: 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
f930: 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
f940: 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
f950: 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
f960: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
f970: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
f980: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
f990: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
f9a0: 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28 70  qliteAuthCheck(p
f9b0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
f9c0: 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
f9d0: 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
f9e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 64 62  eturn;.  if( (db
f9f0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
fa00: 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 29 7b 0a  _InTrans)==0 ){.
fa10: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
fa20: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
fa30: 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20 6e 6f  ot rollback - no
fa40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fa50: 61 63 74 69 76 65 22 29 3b 0a 20 20 20 20 72 65  active");.    re
fa60: 74 75 72 6e 3b 20 0a 20 20 7d 0a 20 20 76 20 3d  turn; .  }.  v =
fa70: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
fa80: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
fa90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  ){.    sqliteVdb
faa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 6c  eAddOp(v, OP_Rol
fab0: 6c 62 61 63 6b 2c 20 30 2c 20 30 29 3b 0a 20 20  lback, 0, 0);.  
fac0: 7d 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  }.  if( !pParse-
fad0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
fae0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
faf0: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
fb00: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
fb10: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a  OE_Default;.  }.
fb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
fb30: 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
fb40: 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
fb50: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 66   schema cookie f
fb60: 6f 72 20 61 6c 6c 0a 2a 2a 20 6e 61 6d 65 64 20  or all.** named 
fb70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
fb80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 43 6f  */.void sqliteCo
fb90: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
fba0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
fbb0: 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
fbc0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
fbd0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  b;.  Vdbe *v = s
fbe0: 71 6c 69 74 65 47 65 74 56 64 62 65 28 70 50 61  qliteGetVdbe(pPa
fbf0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
fc00: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
fc10: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
fc20: 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
fc30: 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pBt!=0 );.  if( 
fc40: 69 44 62 21 3d 31 20 26 26 20 21 44 62 48 61 73  iDb!=1 && !DbHas
fc50: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
fc60: 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 20 29 7b 0a  , DB_Cookie) ){.
fc70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
fc80: 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  dOp(v, OP_Verify
fc90: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 64 62 2d  Cookie, iDb, db-
fca0: 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
fcb0: 5f 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 44 62  _cookie);.    Db
fcc0: 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
fcd0: 69 44 62 2c 20 44 42 5f 43 6f 6f 6b 69 65 29 3b  iDb, DB_Cookie);
fce0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
fcf0: 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
fd00: 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
fd10: 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
fd20: 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
fd30: 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
fd40: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
fd50: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
fd60: 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
fd70: 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
fd80: 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
fd90: 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
fda0: 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
fdb0: 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
fdc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
fdd0: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
fde0: 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
fdf0: 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 70 61  setCheckpoint pa
fe00: 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
fe10: 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
fe20: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
fe30: 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
fe40: 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
fe50: 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
fe60: 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
fe70: 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
fe80: 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
fe90: 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
fea0: 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
feb0: 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
fec0: 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
fed0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
fee0: 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
fef0: 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
ff00: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
ff10: 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
ff20: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
ff30: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
ff40: 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
ff50: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
ff60: 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
ff70: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
ff80: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
ff90: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61  .**.** Only data
ffa0: 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65  base iDb and the
ffb0: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
ffc0: 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
ffd0: 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a   by this call..*
ffe0: 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65  * If iDb==0, the
fff0: 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74  n the main and t
10000 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72  emp databases ar
10010 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
10020 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20     If.** iDb==1 
10030 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65  then only the te
10040 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  mp database is m
10050 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49  ade writable.  I
10060 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65  f iDb>1 then the
10070 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75  .** specified au
10080 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
10090 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
100a0 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
100b0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  writable..*/.voi
100c0 64 20 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69  d sqliteBeginWri
100d0 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
100e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
100f0 65 74 43 68 65 63 6b 70 6f 69 6e 74 2c 20 69 6e  etCheckpoint, in
10100 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
10110 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
10120 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10130 69 66 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  if( DbHasPropert
10140 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f  y(db, iDb, DB_Lo
10150 63 6b 65 64 29 20 29 20 72 65 74 75 72 6e 3b 0a  cked) ) return;.
10160 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56    v = sqliteGetV
10170 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
10180 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
10190 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62  ;.  if( !db->aDb
101a0 5b 69 44 62 5d 2e 69 6e 54 72 61 6e 73 20 29 7b  [iDb].inTrans ){
101b0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
101c0 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
101d0 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 30 29 3b  action, iDb, 0);
101e0 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
101f0 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c  ty(db, iDb, DB_L
10200 6f 63 6b 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  ocked);.    sqli
10210 74 65 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  teCodeVerifySche
10220 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
10230 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31 20  .    if( iDb!=1 
10240 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
10250 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
10260 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 43 68  on(pParse, setCh
10270 65 63 6b 70 6f 69 6e 74 2c 20 31 29 3b 0a 20 20  eckpoint, 1);.  
10280 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10290 73 65 74 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b  setCheckpoint ){
102a0 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
102b0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 68 65 63 6b  ddOp(v, OP_Check
102c0 70 6f 69 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  point, iDb, 0);.
102d0 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74      DbSetPropert
102e0 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 4c 6f  y(db, iDb, DB_Lo
102f0 63 6b 65 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cked);.  }.}../*
10300 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
10310 65 20 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73  e that concludes
10320 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
10330 61 74 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e  at may have chan
10340 67 65 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ged.** the datab
10350 61 73 65 2e 20 20 49 66 20 61 20 73 74 61 74 65  ase.  If a state
10360 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10370 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 74 68   was started, th
10380 65 6e 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50  en emit.** an OP
10390 5f 43 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c  _Commit that wil
103a0 6c 20 63 61 75 73 65 20 74 68 65 20 63 68 61 6e  l cause the chan
103b0 67 65 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74  ges to be commit
103c0 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
103d0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65  ** Note that che
103e0 63 6b 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74  ckpoints are aut
103f0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69  omatically commi
10400 74 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  tted at the end 
10410 6f 66 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e  of.** a statemen
10420 74 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  t.  Note also th
10430 61 74 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  at there can be 
10440 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74  multiple calls t
10450 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 42 65 67 69  o .** sqliteBegi
10460 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10470 29 20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75  ) but there shou
10480 6c 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e  ld only be a sin
10490 67 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  gle.** call to s
104a0 71 6c 69 74 65 45 6e 64 57 72 69 74 65 4f 70 65  qliteEndWriteOpe
104b0 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20  ration() at the 
104c0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
104d0 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  e statement..*/.
104e0 76 6f 69 64 20 73 71 6c 69 74 65 45 6e 64 57 72  void sqliteEndWr
104f0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
10500 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
10510 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10520 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10530 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10540 3e 74 72 69 67 53 74 61 63 6b 20 29 20 72 65 74  >trigStack ) ret
10550 75 72 6e 3b 20 2f 2a 20 69 66 20 74 68 69 73 20  urn; /* if this 
10560 69 73 20 69 6e 20 61 20 74 72 69 67 67 65 72 20  is in a trigger 
10570 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
10580 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10590 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
105a0 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 66  urn;.  if( db->f
105b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e  lags & SQLITE_In
105c0 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Trans ){.    /* 
105d0 41 20 42 45 47 49 4e 20 68 61 73 20 65 78 65 63  A BEGIN has exec
105e0 75 74 65 64 2e 20 20 44 6f 20 6e 6f 74 20 63 6f  uted.  Do not co
105f0 6d 6d 69 74 20 75 6e 74 69 6c 20 77 65 20 73 65  mmit until we se
10600 65 20 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20  e an explicit.  
10610 20 20 2a 2a 20 43 4f 4d 4d 49 54 20 73 74 61 74    ** COMMIT stat
10620 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 7d 65 6c 73  ement. */.  }els
10630 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  e{.    sqliteVdb
10640 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6d  eAddOp(v, OP_Com
10650 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 0, 0);.  }.
10660 7d 0a                                            }.