/ Hex Artifact Content
Login

Artifact 951a36b246d9f38f2340562bfdd6a96bf7433530:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 32 34 36 20 32 30 30 34 2f 30 38 2f 30 38 20 32  246 2004/08/08 2
0300: 33 3a 33 39 3a 31 39 20 64 72 68 20 45 78 70 20  3:39:19 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73  sqlite3BeginPars
0440: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0450: 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67   int explainFlag
0460: 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70  ){.  pParse->exp
0470: 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e 46 6c  lain = explainFl
0480: 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56  ag;.  pParse->nV
0490: 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ar = 0;.}../*.**
04a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
04b0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
04c0: 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65  single SQL state
04d0: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
04e0: 20 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44   parsed and a VD
04f0: 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78  BE program to ex
0500: 65 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65  ecute that state
0510: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
0520: 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73   prepared.  This
0530: 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68   routine puts th
0540: 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63  e finishing touc
0550: 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44  hes on the.** VD
0560: 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72  BE program and r
0570: 65 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65  esets the pParse
0580: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
0590: 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65  he next.** parse
05a0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
05b0: 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  t if an error oc
05c0: 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74  curred, it might
05d0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
05e0: 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64  t.** no VDBE cod
05f0: 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e  e was generated.
0600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0610: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72  FinishCoding(Par
0620: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0630: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62  qlite *db;.  Vdb
0640: 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c  e *v;..  if( sql
0650: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
0660: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ed ) return;..  
0670: 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65  /* Begin by gene
0680: 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d  rating some term
0690: 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20  ination code at 
06a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
06b0: 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d   ** vdbe program
06c0: 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  .  */.  db = pPa
06d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73  rse->db;.  v = s
06e0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
06f0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
0700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
0710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c  eAddOp(v, OP_Hal
0720: 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  t, 0, 0);..    /
0730: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
0740: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
0750: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
0760: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
0770: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
0780: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
0790: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
07a0: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
07b0: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
07c0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
07d0: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
07e0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
07f0: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
0800: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
0810: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
0820: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
0830: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
0840: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
0850: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
0860: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
0870: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
0880: 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20  Goto>0 ){.      
0890: 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  u32 mask;.      
08a0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73  int iDb;.      s
08b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
08c0: 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f  P2(v, pParse->co
08d0: 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71 6c 69  okieGoto-1, sqli
08e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
08f0: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 66 6f  dr(v));.      fo
0900: 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b  r(iDb=0, mask=1;
0910: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61   iDb<db->nDb; ma
0920: 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a  sk<<=1, iDb++){.
0930: 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 61 73          if( (mas
0940: 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  k & pParse->cook
0950: 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e  ieMask)==0 ) con
0960: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73  tinue;.        s
0970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0980: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
0990: 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20  n, iDb, (mask & 
09a0: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
09b0: 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  k)!=0);.        
09c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
09d0: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
09e0: 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65  kie, iDb, pParse
09f0: 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
0a00: 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b]);.      }.   
0a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0a20: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
0a30: 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  0, pParse->cooki
0a40: 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23  eGoto);.    }..#
0a50: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
0a60: 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70    /* Add a No-op
0a70: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
0a80: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
0a90: 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 64   of the compiled
0aa0: 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74   SQL.    ** stat
0ab0: 65 6d 65 6e 74 20 61 73 20 69 74 73 20 50 33 20  ement as its P3 
0ac0: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
0ad0: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
0ae0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  the functionalit
0af0: 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  y.    ** of the 
0b00: 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 69 74  program.  But it
0b10: 20 64 6f 65 73 20 6d 61 6b 65 20 69 74 20 65 61   does make it ea
0b20: 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 20  sier to debug.. 
0b30: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
0b40: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e  3VdbeOp3(v, OP_N
0b50: 6f 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73  oop, 0, 0, pPars
0b60: 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d  e->zSql, pParse-
0b70: 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a  >zTail-pParse->z
0b80: 53 71 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Sql);.#endif.  }
0b90: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
0ba0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
0bb0: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
0bc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
0bd0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
0be0: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
0bf0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
0c00: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0c10: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0c20: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0c30: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
0c40: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
0c50: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
0c60: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
0c70: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29  pParse->explain)
0c80: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
0c90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   = pParse->nErr 
0ca0: 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
0cb0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
0cc0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
0cd0: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
0ce0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
0cf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
0d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0d10: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
0d20: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
0d30: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
0d40: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
0d50: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
0d60: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20   pParse->nAgg = 
0d70: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
0d80: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
0d90: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
0da0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
0db0: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
0dc0: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
0dd0: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
0de0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
0df0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
0e00: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
0e10: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0e20: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
0e30: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
0e40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
0e50: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
0e60: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
0e70: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
0e80: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
0e90: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
0ea0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
0eb0: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
0ec0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
0ed0: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
0ee0: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
0ef0: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
0f00: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
0f10: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
0f20: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
0f30: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
0f40: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
0f50: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
0f60: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
0f70: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
0f80: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
0f90: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
0fa0: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
0fb0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
0fc0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
0fd0: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
0fe0: 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  te *db, const ch
0ff0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
1000: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
1010: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
1020: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
1030: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
1040: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
1050: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1060: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
1070: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
1080: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1090: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10a0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
10b0: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
10c0: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
10d0: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
10e0: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
10f0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1100: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
1110: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
1120: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
1130: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1140: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
1150: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
1160: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1170: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1180: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1190: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
11a0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
11b0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
11c0: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
11d0: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
11e0: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
11f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1200: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
1210: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
1220: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1230: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
1240: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1250: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1260: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
1270: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
1280: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
1290: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
12a0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
12b0: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
12c0: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
12d0: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
12e0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
12f0: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
1300: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
1310: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
1320: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
1330: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
1340: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
1350: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  te3LocateTable(P
1360: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1370: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1390: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
13a0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
13b0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
13c0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
13d0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
13e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
13f0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
1400: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
1410: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
1420: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1430: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1440: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
1450: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
1460: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1470: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1480: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
1490: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( p==0 ){.    i
14a0: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
14b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14c0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
14d0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  uch table: %s.%s
14e0: 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  ", zDbase, zName
14f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1500: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1510: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
1520: 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
1530: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1540: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
1550: 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74  le \"%s\" is not
1560: 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25   in database \"%
1570: 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  s\"",.         z
1580: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
1590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15b0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
15c0: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
15d0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
15e0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
15f0: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
1600: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1610: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
1620: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
1630: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1640: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1650: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
1660: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
1670: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
1680: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1690: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
16a0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
16b0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
16c0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
16d0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
16e0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
16f0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
1700: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
1710: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
1720: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
1730: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1740: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
1750: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
1760: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1770: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1780: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
1790: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
17a0: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
17b0: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
17c0: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
17d0: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
17e0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
17f0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  dIndex(sqlite *d
1800: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1810: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
1820: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
1830: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
1840: 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e  .  assert( (db->
1850: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1860: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64  nitialized) || d
1870: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
1880: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1890: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
18a0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
18b0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
18c0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
18d0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
18e0: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
18f0: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
1900: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1910: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1920: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1930: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78  (&db->aDb[j].idx
1940: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1950: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1960: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1970: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
1990: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
19a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
19b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
19c0: 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  eeIndex(Index *p
19d0: 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
19e0: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  p->zColAff);.  s
19f0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
1a00: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
1a10: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
1a20: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
1a30: 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65  h table, and fre
1a40: 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20  e.** its memory 
1a50: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
1a60: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72  * The index is r
1a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1a80: 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61  database hash ta
1a90: 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69  bles but.** it i
1aa0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
1ab0: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
1ac0: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
1ad0: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
1ae0: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
1af0: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
1b00: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
1b10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b20: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
1b30: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e  x(sqlite *db, In
1b40: 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78  dex *p){.  Index
1b50: 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72   *pOld;..  asser
1b60: 74 28 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a  t( db!=0 && p->z
1b70: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  Name!=0 );.  pOl
1b80: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
1b90: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
1ba0: 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  ->iDb].idxHash, 
1bb0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e      strlen(p->zN
1be0: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66  ame)+1, 0);.  if
1bf0: 28 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c  ( pOld!=0 && pOl
1c00: 64 21 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  d!=p ){.    sqli
1c10: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
1c20: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69  b->aDb[p->iDb].i
1c30: 64 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e  dxHash, pOld->zN
1c40: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
1c50: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
1c60: 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  (pOld->zName)+1,
1c70: 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 66 72   pOld);.  }.  fr
1c80: 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f  eeIndex(p);.}../
1c90: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
1ca0: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1cb0: 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1cc0: 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69   remove.** the i
1cd0: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
1ce0: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61  dex hash table a
1cf0: 6e 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f  nd free its memo
1d00: 72 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73  ry.** structures
1d10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d20: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
1d30: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1d40: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
1d50: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
1d60: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1d70: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  x;.  int len;.. 
1d80: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
1d90: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
1da0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
1db0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
1dc0: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49 64  Db].idxHash, zId
1dd0: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
1de0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1df0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
1e00: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1e10: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
1e20: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
1e30: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1e40: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
1e50: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1e60: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
1e70: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
1e80: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
1e90: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
1ea0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
1eb0: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
1ec0: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
1ed0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
1ee0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
1ef0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1f00: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
1f10: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
1f20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
1f30: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
1f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
1f50: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
1f60: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1f70: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1f80: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
1f90: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
1fa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1fb0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
1fc0: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
1fd0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1fe0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
1ff0: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2000: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
2010: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
2020: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
2030: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
2040: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
2050: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
2060: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
2070: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
2080: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2090: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
20a0: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
20b0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
20c0: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
20d0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
20e0: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
20f0: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
2100: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
2110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2120: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
2130: 6d 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69  ma(sqlite *db, i
2140: 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45  nt iDb){.  HashE
2150: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
2160: 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68  sh temp1;.  Hash
2170: 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c   temp2;.  int i,
2180: 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   j;..  assert( i
2190: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
21a0: 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  >nDb );.  db->fl
21b0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
21c0: 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f  nitialized;.  fo
21d0: 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e  r(i=iDb; i<db->n
21e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
21f0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
2200: 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d  [i];.    temp1 =
2210: 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20   pDb->tblHash;. 
2220: 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e     temp2 = pDb->
2230: 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71  trigHash;.    sq
2240: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
2250: 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51  Db->trigHash, SQ
2260: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
2270: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2280: 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d  3HashClear(&pDb-
2290: 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  >aFKey);.    sql
22a0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70  ite3HashClear(&p
22b0: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20  Db->idxHash);.  
22c0: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
22d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
22e0: 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p2); pElem; pEle
22f0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
2300: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
2310: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
2320: 72 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  r = sqliteHashDa
2330: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20  ta(pElem);.     
2340: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
2350: 69 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b  igger(pTrigger);
2360: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2370: 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d  e3HashClear(&tem
2380: 70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p2);.    sqlite3
2390: 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74  HashInit(&pDb->t
23a0: 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  blHash, SQLITE_H
23b0: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
23c0: 20 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71      for(pElem=sq
23d0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74  liteHashFirst(&t
23e0: 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45  emp1); pElem; pE
23f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
2400: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
2410: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2420: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
2430: 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Elem);.      sql
2440: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
2450: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  db, pTab);.    }
2460: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2470: 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20  Clear(&temp1);. 
2480: 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72     DbClearProper
2490: 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68  ty(db, i, DB_Sch
24a0: 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20  emaLoaded);.    
24b0: 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75  if( iDb>0 ) retu
24c0: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
24d0: 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62  ( iDb==0 );.  db
24e0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
24f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
2500: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
2510: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
2520: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2530: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
2540: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
2550: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72  n remove then fr
2560: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
2570: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
2580: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
2590: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
25a0: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
25b0: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
25c0: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
25d0: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
25e0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
25f0: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
2600: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
2610: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
2620: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
2630: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
2640: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2650: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
2660: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
2670: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
2680: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
2690: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
26a0: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
26b0: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
26c0: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
26d0: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
26e0: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
26f0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
2700: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2710: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2720: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2730: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2740: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
2750: 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e  liteFree(pDb->zN
2760: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
2770: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
2780: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2790: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
27a0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
27b0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
27c0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
27d0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
27e0: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
27f0: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
2800: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
2810: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
2820: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
2830: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
2840: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
2850: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
2860: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
2870: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
2880: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ));.    sqliteFr
2890: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
28a0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
28b0: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
28c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
28d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
28e0: 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
28f0: 6b 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  k occurs.  If th
2900: 65 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65  ere were.** sche
2910: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
2920: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
2930: 6e 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20  n, then we have 
2940: 74 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  to reset the.** 
2950: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
2960: 62 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20  bles and reload 
2970: 74 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  them from disk..
2980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2990: 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43  ollbackInternalC
29a0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64  hanges(sqlite *d
29b0: 62 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  b){.  if( db->fl
29c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74  ags & SQLITE_Int
29d0: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
29e0: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
29f0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
2a00: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
2a10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a20: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
2a30: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
2a40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
2a50: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
2a60: 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  ges(sqlite *db){
2a70: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
2a80: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2a90: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2aa0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
2ab0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61   names from a ta
2ac0: 62 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a  ble or view..*/.
2ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2ae0: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
2af0: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
2b00: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
2b10: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
2b20: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
2b30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
2b40: 6f 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  ol=pTable->aCol;
2b50: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
2b60: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
2b70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
2b80: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
2b90: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
2ba0: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c  >zDflt);.    sql
2bb0: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  iteFree(pCol->zT
2bc0: 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ype);.  }.  sqli
2bd0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61  teFree(pTable->a
2be0: 43 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Col);.  pTable->
2bf0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
2c00: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a  le->nCol = 0;.}.
2c10: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
2c20: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
2c30: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
2c40: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
2c50: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
2c60: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
2c70: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
2c80: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2c90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
2ca0: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
2cb0: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
2cc0: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
2cd0: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
2ce0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
2cf0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
2d00: 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  le.  Nor does it
2d10: 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69   remove.** forei
2d20: 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65  gn keys from the
2d30: 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61   sqlite.aFKey ha
2d40: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
2d50: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
2d60: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
2d70: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
2d80: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
2d90: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
2da0: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
2db0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73  e..**.** Indices
2dc0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2dd0: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 75   the table are u
2de0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2df0: 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73 74   "db".** data st
2e00: 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d 4e  ructure if db!=N
2e10: 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c  ULL.  If db==NUL
2e20: 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61 63  L, indices attac
2e30: 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61  hed to.** the ta
2e40: 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ble are deleted,
2e50: 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75 6d   but it is assum
2e60: 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c 72  ed they have alr
2e70: 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c  eady been.** unl
2e80: 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  inked..*/.void s
2e90: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
2ea0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61  e(sqlite *db, Ta
2eb0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
2ec0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
2ed0: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
2ee0: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
2ef0: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  ;..  if( pTable=
2f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
2f10: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
2f20: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
2f30: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
2f40: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  .  */.  for(pInd
2f50: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
2f60: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
2f70: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
2f80: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
2f90: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
2fa0: 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  t( pIndex->iDb==
2fb0: 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28  pTable->iDb || (
2fc0: 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26  pTable->iDb==0 &
2fd0: 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31  & pIndex->iDb==1
2fe0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  ) );.    sqliteD
2ff0: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
3000: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
3010: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72  * Delete all for
3020: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
3030: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
3040: 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a  able.  The keys.
3050: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
3060: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e   already been un
3070: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
3080: 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74  db->aFKey hash t
3090: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72  able .  */.  for
30a0: 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70  (pFKey=pTable->p
30b0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
30c0: 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20  ey=pNextFKey){. 
30d0: 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70     pNextFKey = p
30e0: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b  FKey->pNextFrom;
30f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
3100: 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62  ble->iDb<db->nDb
3110: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3120: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
3130: 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d  &db->aDb[pTable-
3140: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20  >iDb].aFKey,.   
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
3170: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
3180: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
3190: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
31a0: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a  ee(pFKey);.  }..
31b0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
31c0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
31d0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
31e0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
31f0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3200: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
3210: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
3220: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
3230: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
3240: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3250: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
3260: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3270: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3280: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3290: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
32a0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
32b0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
32c0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
32d0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
32e0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
32f0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3300: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3310: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3320: 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69  qlite *db, int i
3330: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
3340: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
3350: 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70  le *p;.  FKey *p
3360: 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a  F1, *pF2;.  Db *
3370: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
3380: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
3390: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
33a0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
33b0: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26  sert( zTabName &
33c0: 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b  & zTabName[0] );
33d0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
33e0: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
33f0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3400: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  &pDb->tblHash, z
3410: 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  TabName, strlen(
3420: 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b  zTabName)+1, 0);
3430: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
3440: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
3450: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
3460: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
3470: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
3480: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
3490: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
34a0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
34b0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  Db->aFKey, pF1->
34c0: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
34d0: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
34e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34f0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
3500: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
3510: 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78  , nTo, pF1->pNex
3520: 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tTo);.      }els
3530: 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e{.        while
3540: 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e  ( pF2 && pF2->pN
3550: 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46  extTo!=pF1 ){ pF
3560: 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20  2=pF2->pNextTo; 
3570: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  }.        if( pF
3580: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  2 ){.          p
3590: 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46  F2->pNextTo = pF
35a0: 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20  1->pNextTo;.    
35b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
35d0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
35e0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
35f0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
3600: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3610: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
3620: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
3630: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
3640: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
3650: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77   that.** token w
3660: 69 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f  ith any quotatio
3670: 6e 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61  ns removed.  Spa
3680: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
3690: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
36a0: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
36b0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
36c0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
36d0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
36e0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
36f0: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
3700: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f 69   really just poi
3710: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
3720: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
3730: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
3740: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
3750: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
3760: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
3770: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
3780: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
3790: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
37a0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
37b0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
37c0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
37d0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
37e0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
37f0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
3800: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e  sqliteStrNDup(pN
3810: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
3830: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
3840: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
3850: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3860: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
3870: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
3880: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
3890: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
38a0: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
38b0: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
38c0: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
38d0: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
38e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
38f0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
3900: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44  (Vdbe *v, int iD
3910: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
3920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3930: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
3940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3950: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
3960: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
3970: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
3980: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
3990: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
39a0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
39b0: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
39c0: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
39d0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
39e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
39f0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
3a00: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
3a10: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
3a20: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
3a30: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
3a40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3a50: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
3a60: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
3a70: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
3a80: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
3a90: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
3aa0: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
3ab0: 74 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33  t findDb(sqlite3
3ac0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
3ad0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
3ae0: 44 62 20 2a 70 44 62 3b 0a 20 20 66 6f 72 28 70  Db *pDb;.  for(p
3af0: 44 62 3d 64 62 2d 3e 61 44 62 2c 20 69 3d 30 3b  Db=db->aDb, i=0;
3b00: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 2c   i<db->nDb; i++,
3b10: 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pDb++){.    if(
3b20: 20 70 4e 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65   pName->n==strle
3b30: 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  n(pDb->zName) &&
3b40: 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c   .        0==sql
3b50: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 44 62  ite3StrNICmp(pDb
3b60: 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ->zName, pName->
3b70: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29 7b 0a  z, pName->n) ){.
3b80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
3b90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3ba0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  rn -1;.}../* The
3bb0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f   table or view o
3bc0: 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69  r trigger name i
3bd0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
3be0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
3bf0: 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  ens.** pName1 an
3c00: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
3c10: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
3c20: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
3c30: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   for example:.**
3c40: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
3c50: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
3c60: 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  ** .** Then pNam
3c70: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
3c80: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
3c90: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
3ca0: 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65  r hand if.** the
3cb0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
3cc0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
3cd0: 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ed, i.e.:.**.** 
3ce0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
3cf0: 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  (...);.**.** The
3d00: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
3d10: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
3d20: 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a  me2 is ""..**.**
3d30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
3d40: 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c  ts the *ppUnqual
3d50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
3d60: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
3d70: 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61  pName1 or.** pNa
3d80: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
3d90: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
3da0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
3db0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
3dc0: 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22  * database "xxx"
3dd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3de0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50  .int sqlite3TwoP
3df0: 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  artName(.  Parse
3e00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
3e10: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
3e20: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
3e30: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
3e40: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f   *pName1,      /
3e50: 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74  * The "xxx" in t
3e60: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
3e70: 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20  " or "xxx" */.  
3e80: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
3e90: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
3ea0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
3eb0: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
3ec0: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
3ed0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
3ee0: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
3ef0: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
3f00: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f20: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
3f30: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
3f40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3f50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
3f60: 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
3f70: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
3f80: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
3f90: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70  t.busy );.    *p
3fa0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
3fb0: 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44  .    iDb = findD
3fc0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
3fd0: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
3fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3ff0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4000: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
4010: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
4020: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4030: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
4040: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
4050: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4060: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
4070: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
4080: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
4090: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
40a0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
40b0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
40c0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
40d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
40e0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
40f0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
4100: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
4110: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
4120: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
4130: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
4140: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
4150: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
4160: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
4170: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
4180: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
4190: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
41a0: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
41b0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
41c0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
41d0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
41e0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
41f0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
4200: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
4210: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
4220: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
4230: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
4240: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
4250: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
4260: 69 74 2e 62 75 73 79 20 26 26 20 30 3d 3d 73 71  it.busy && 0==sq
4270: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
4280: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
4290: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
42a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
42b0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
42c0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
42d0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
42e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
42f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
4300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4320: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
4330: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
4340: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
4350: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
4360: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
4370: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
4380: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
4390: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
43a0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
43b0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
43c0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
43d0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
43e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
43f0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
4400: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
4410: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
4420: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
4430: 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b  he.** pStart tok
4440: 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45  en is the CREATE
4450: 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68   and pName is th
4460: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
4470: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
4480: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
4490: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
44a0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
44b0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
44c0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
44d0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
44e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
44f0: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
4500: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
4510: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
4520: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
4530: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
4540: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
4550: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
4560: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
4570: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
4580: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
4590: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
45a0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
45b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
45c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
45d0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
45e0: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
45f0: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
4600: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
4610: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
4620: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
4630: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
4640: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
4650: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
4660: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
4670: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
4680: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
4690: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
46a0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
46b0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
46c0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
46d0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
46e0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
46f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4700: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
4710: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
4720: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
4730: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
4740: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
4750: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
4760: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
4770: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
4780: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
4790: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
47a0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
47b0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
47c0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
47d0: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
47e0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
47f0: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
4800: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
4810: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
4820: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
4830: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
4840: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
4850: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
4860: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
4870: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
4880: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4890: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
48a0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
48b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
48c0: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
48d0: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
48e0: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
48f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61   */..  /* The ta
4900: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
4910: 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61   to create is pa
4920: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4930: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
4940: 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20    ** pName1 and 
4950: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4960: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4970: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4980: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
4990: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
49a0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
49b0: 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65  ;.  ** .  ** The
49c0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
49d0: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
49e0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
49f0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4a00: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
4a10: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4a20: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4a30: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
4a40: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4a50: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
4a60: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4a70: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
4a80: 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a  me2 is ""..  **.
4a90: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65    ** The call be
4aa0: 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61  low sets the pNa
4ab0: 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  me pointer to po
4ac0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4ad0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a   (pName1 or.  **
4ae0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4af0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4b00: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4b10: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44   The variable iD
4b20: 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f  b is.  ** set to
4b30: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
4b40: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
4b50: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
4b60: 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  w is to be.  ** 
4b70: 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f  created in..  */
4b80: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
4b90: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
4ba0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
4bb0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
4bc0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
4bd0: 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  n;.  if( isTemp 
4be0: 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  && iDb>1 ){.    
4bf0: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
4c00: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
4c10: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
4c20: 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20   qualified */.  
4c30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4c40: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
4c50: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
4c60: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
4c70: 69 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73  ied");.    pPars
4c80: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
4c90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
4ca0: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
4cb0: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
4cc0: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
4cd0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
4ce0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4cf0: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
4d00: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
4d10: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
4d20: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
4d30: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
4d40: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
4d50: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4d60: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
4d70: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
4d80: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
4d90: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
4da0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
4db0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
4dc0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
4dd0: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
4de0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
4df0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
4e00: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
4e10: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4e20: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
4e30: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
4e40: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4e50: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
4e60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
4e70: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
4e80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4e90: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
4ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
4eb0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
4ec0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4ed0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
4ee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ef0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4f00: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
4f10: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4f20: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
4f30: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
4f40: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
4f50: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
4f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f70: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4f80: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
4f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4fa0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4fb0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
4fc0: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
4fd0: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
4fe0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4ff0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5000: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
5010: 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e   /* Before tryin
5020: 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65  g to create a te
5030: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d  mporary table, m
5040: 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72  ake sure the Btr
5050: 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64  ee for.  ** hold
5060: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
5070: 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20  bles is open..  
5080: 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  */.  if( isTemp 
5090: 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  && db->aDb[1].pB
50a0: 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
50b0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
50c0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
50d0: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
50e0: 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
50f0: 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
5100: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
5110: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5120: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5130: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
5140: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
5150: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
5160: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
5170: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
5180: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
5190: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
51a0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  rr++;.      pPar
51b0: 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
51c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
51d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
51e0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
51f0: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
5200: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
5210: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5220: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
5230: 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
5240: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
5250: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5260: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5270: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5280: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
5290: 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
52a0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
52b0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
52c0: 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
52d0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
52e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
52f0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
5300: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
5310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5320: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
5330: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
5340: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
5350: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
5360: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
5370: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
5380: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
5390: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
53a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
53b0: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
53c0: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
53d0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
53e0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
53f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62  ) return;.  pTab
5400: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
5410: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
5420: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
5430: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
5440: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
5450: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5460: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
5470: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
5480: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
5490: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
54a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
54b0: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
54c0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
54d0: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20  Name, 0))!=0 && 
54e0: 0a 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20  .      ( iDb==0 
54f0: 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  || !db->init.bus
5500: 79 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  y) ){.    sqlite
5510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5520: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
5530: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
5540: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
5550: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5560: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5570: 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20  n;.  }.  pTable 
5580: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
5590: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
55a0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
55b0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
55c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
55d0: 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  M;.    pParse->n
55e0: 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Err++;.    sqlit
55f0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5600: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5610: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
5620: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
5630: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >nCol = 0;.  pTa
5640: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  ble->aCol = 0;. 
5650: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
5660: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
5670: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61  Index = 0;.  pTa
5680: 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  ble->iDb = iDb;.
5690: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
56a0: 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65  ewTable ) sqlite
56b0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
56c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
56d0: 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  le);.  pParse->p
56e0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
56f0: 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  e;..  /* Begin g
5700: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
5710: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
5720: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
5730: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
5740: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
5750: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
5760: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
5770: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
5780: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
5790: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
57a0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
57b0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
57c0: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
57d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
57e0: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
57f0: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
5800: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
5810: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
5820: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
5830: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
5840: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
5850: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
5860: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
5870: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
5880: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
5890: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
58a0: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
58b0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
58c0: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
58d0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
58e0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
58f0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
5900: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
5910: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
5920: 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20    /* Every time 
5930: 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63  a new table is c
5940: 72 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d  reated the file-
5950: 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e  format.    ** an
5960: 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d  d encoding meta-
5970: 76 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69  values are set i
5980: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
5990: 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74  in.    ** case t
59a0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
59b0: 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a   table created..
59c0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
59d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
59e0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66  P_Integer, db->f
59f0: 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a  ile_format, 0);.
5a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5a10: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5a20: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
5a30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5a40: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5a50: 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a  r, db->enc, 0);.
5a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5a80: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a  okie, iDb, 4);..
5a90: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
5aa0: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
5ab0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
5ac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5ad0: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
5ae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5af0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
5b00: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5b10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5b20: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
5b30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5b40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
5b50: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
5b60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
5b70: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
5b80: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
5b90: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
5ba0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
5bb0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
5bc0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
5bd0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
5be0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
5bf0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
5c00: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
5c10: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
5c20: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
5c30: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
5c40: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
5c50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5c60: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
5c70: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
5c80: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
5c90: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
5ca0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
5cb0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
5cc0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
5cd0: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
5ce0: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
5cf0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
5d00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5d10: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
5d20: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
5d30: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
5d40: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
5d50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
5d60: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
5d70: 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61  3StrICmp(z, p->a
5d80: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
5d90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5da0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5db0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
5dc0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
5dd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
5de0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
5df0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
5e00: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
5e10: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
5e20: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
5e30: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
5e40: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
5e50: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
5e60: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
5e70: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
5e80: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
5e90: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
5ea0: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
5eb0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
5ec0: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
5ed0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
5ee0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
5ef0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
5f00: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
5f10: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
5f20: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
5f30: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
5f40: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
5f50: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
5f60: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
5f70: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
5f80: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
5f90: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
5fa0: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
5fb0: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
5fc0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
5fd0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
5fe0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43  E_AFF_NONE;.  pC
5ff0: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72  ol->pColl = pPar
6000: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
6010: 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  l;.  p->nCol++;.
6020: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6030: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6040: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
6050: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
6060: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
6070: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6080: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
6090: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
60a0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
60b0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
60c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
60d0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
60e0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
60f0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
6100: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6110: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
6120: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
6130: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
6140: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
6150: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
6160: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
6170: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
6180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
6190: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
61a0: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
61b0: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
61c0: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
61d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
61e0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
61f0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
6200: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
6210: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
6220: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6230: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
6240: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
6250: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
6260: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
6270: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
6280: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
6290: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
62a0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
62b0: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
62c0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
62d0: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
62e0: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
62f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6300: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
6310: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
6320: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
6330: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
6340: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
6350: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
6360: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
6370: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
6380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6390: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
63a0: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
63b0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
63c0: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
63d0: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
63e0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
63f0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6400: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
6410: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
6420: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6430: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
6440: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
6450: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
6460: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
6470: 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28  pLast->n + Addr(
6480: 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72  pLast->z) - Addr
6490: 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73  (pFirst->z);.  s
64a0: 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
64b0: 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20  (pz, pFirst->z, 
64c0: 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a  n, 0);.  z = *pz
64d0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
64e0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a  eturn;.  for(i=j
64f0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
6500: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d      int c = z[i]
6510: 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  ;.    if( isspac
6520: 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e(c) ) continue;
6530: 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b  .    z[j++] = c;
6540: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
6550: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
6560: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
6570: 69 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d  ityType(z, n);.}
6580: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65  ../*.** The give
6590: 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64  n token is the d
65a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
65b0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
65c0: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65   added to.** the
65d0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
65e0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
65f0: 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46  ion.  If "minusF
6600: 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74  lag" is true, it
6610: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61  .** means the va
6620: 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72  lue token was pr
6630: 65 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75  eceded by a minu
6640: 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  s sign..**.** Th
6650: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6660: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
6670: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
6680: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
6690: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
66a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
66b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
66c0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
66d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
66e0: 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69  en *pVal, int mi
66f0: 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c  nusFlag){.  Tabl
6700: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
6710: 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66   char **pz;.  if
6720: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
6730: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
6740: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
6750: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
6760: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a  0 ) return;.  pz
6770: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a   = &p->aCol[i].z
6780: 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75  Dflt;.  if( minu
6790: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c  sFlag ){.    sql
67a0: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
67b0: 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d  z, "-", 1, pVal-
67c0: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
67d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
67e0: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
67f0: 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61  pz, pVal->z, pVa
6800: 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  l->n, 0);.  }.  
6810: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a  sqlite3Dequote(*
6820: 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pz);.}../*.** De
6830: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
6840: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
6850: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
6860: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
6870: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
6880: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
6890: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
68a0: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
68b0: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
68c0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
68d0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
68e0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
68f0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
6900: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
6910: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
6920: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
6930: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
6940: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
6950: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
6960: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
6970: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
6980: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
6990: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
69a0: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
69b0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
69c0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
69d0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
69e0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
69f0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
6a00: 61 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20  as the row id.  
6a10: 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46  (Exception:.** F
6a20: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
6a30: 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
6a40: 6f 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c  older databases,
6a50: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   do not do this.
6a60: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66  ** if the file f
6a70: 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75  ormat version nu
6a80: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
6a90: 6e 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54  n 1.)  Set the T
6aa0: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
6ab0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
6ac0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
6ad0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
6ae0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
6af0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6b00: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
6b10: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
6b20: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
6b30: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
6b40: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
6b50: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
6b60: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
6b70: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
6b80: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
6b90: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
6ba0: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
6bb0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
6bc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
6bd0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
6be0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
6bf0: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
6c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6c10: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
6c20: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
6c30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6c40: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
6c50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
6c60: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
6c70: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
6c80: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
6c90: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
6ca0: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
6cb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6cc0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
6cd0: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
6ce0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
6cf0: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
6d00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
6d10: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
6d20: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
6d30: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
6d40: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
6d50: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
6d60: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
6d70: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
6d80: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
6d90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
6da0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
6db0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6dc0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
6dd0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
6de0: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
6df0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6e00: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
6e10: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
6e20: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
6e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6e60: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
6e70: 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol ) pTab->aCol[
6e80: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
6e90: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
6ea0: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
6eb0: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
6ec0: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
6ed0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
6ee0: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
6ef0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
6f00: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
6f10: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
6f20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
6f30: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
6f40: 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  0 ){.    pTab->i
6f50: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
6f60: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
6f70: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73   onError;.  }els
6f80: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
6f90: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
6fa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
6fb0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29  , onError, 0, 0)
6fc0: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
6fd0: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
6fe0: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
6ff0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7000: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
7010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
7020: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
7030: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
7040: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
7050: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
7060: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
7070: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
7080: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
7090: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
70a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
70b0: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
70c0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
70d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
70e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
70f0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
7100: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
7110: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
7120: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
7130: 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20  Col-1;..  pColl 
7140: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
7150: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
7160: 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20  Type, nType);.  
7170: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c  p->aCol[i].pColl
7180: 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20   = pColl;..  /* 
7190: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
71a0: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
71b0: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
71c0: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
71d0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69  ,.  ** then an i
71e0: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
71f0: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
7200: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
7210: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74   the.  ** collat
7220: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
7230: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
7240: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
7250: 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  se..  */.  for(p
7260: 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b  Idx = p->pIndex;
7270: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
7280: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73  ->pNext){.    as
7290: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
72a0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  umn==1 );.    if
72b0: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
72c0: 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b  [0]==i ) pIdx->k
72d0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
72e0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a  = pColl;.  }.}..
72f0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64  /*.** Locate and
7300: 20 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79   return an entry
7310: 20 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f   from the db.aCo
7320: 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65  llSeq hash table
7330: 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a  . If the entry.*
7340: 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a  * specified by z
7350: 4e 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69  Name and nName i
7360: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20  s not found and 
7370: 70 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74  parameter 'creat
7380: 65 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74  e' is.** true, t
7390: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
73a0: 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
73b0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
73c0: 2a 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65  *.** Each pointe
73d0: 72 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  r stored in the 
73e0: 73 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71  sqlite3.aCollSeq
73f0: 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74   hash table cont
7400: 61 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79  ains an.** array
7410: 20 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65   of three CollSe
7420: 71 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  q structures. Th
7430: 65 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63  e first is the c
7440: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7450: 65 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20  e.** prefferred 
7460: 66 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73  for UTF-8, the s
7470: 65 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20  econd UTF-16le, 
7480: 61 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54  and the third UT
7490: 46 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74  F-16be..**.** St
74a0: 6f 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ored immediately
74b0: 20 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65   after the three
74c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
74d0: 6e 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f  nces is a copy o
74e0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  f.** the collati
74f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
7500: 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  . A pointer to t
7510: 68 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74  his string is st
7520: 6f 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20  ored in.** each 
7530: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7540: 63 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ce structure..*/
7550: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
7560: 2a 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74  * findCollSeqEnt
7570: 72 79 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  ry(.  sqlite *db
7580: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7590: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
75a0: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
75b0: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
75c0: 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d  Coll;.  if( nNam
75d0: 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74  e<0 ) nName = st
75e0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  rlen(zName);.  p
75f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
7600: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
7610: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
7620: 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70  me);..  if( 0==p
7630: 43 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29  Coll && create )
7640: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
7650: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69  liteMalloc( 3*si
7660: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e  zeof(*pColl) + n
7670: 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20  Name + 1 );.    
7680: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
7690: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
76a0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
76b0: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
76c0: 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[0].enc = SQLIT
76d0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43  E_UTF8;.      pC
76e0: 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[1].zName = (
76f0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
7700: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
7710: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7720: 31 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c  16LE;.      pCol
7730: 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[2].zName = (ch
7740: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
7750: 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e       pColl[2].en
7760: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
7770: 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  BE;.      memcpy
7780: 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c  (pColl[0].zName,
7790: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
77a0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a        pColl[0].z
77b0: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
77c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
77d0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43  shInsert(&db->aC
77e0: 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d  ollSeq, pColl[0]
77f0: 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70  .zName, nName, p
7800: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
7810: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
7820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7830: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
7840: 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   to a UTF-8 enco
7850: 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65  ded string nName
7860: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20   bytes long..** 
7870: 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53  Return the CollS
7880: 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  eq* pointer for 
7890: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
78a0: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61  quence named zNa
78b0: 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  me.** for the en
78c0: 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f  coding 'enc' fro
78d0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27  m the database '
78e0: 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  db'..**.** If th
78f0: 65 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65  e entry specifie
7900: 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  d is not found a
7910: 6e 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74  nd 'create' is t
7920: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
7930: 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e   a.** new entry.
7940: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
7950: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c  rn NULL..*/.Coll
7960: 53 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  Seq *sqlite3Find
7970: 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74  CollSeq(.  sqlit
7980: 65 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c  e *db,.  u8 enc,
7990: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
79a0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
79b0: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
79c0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
79d0: 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65  oll = findCollSe
79e0: 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65  qEntry(db, zName
79f0: 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29  , nName, create)
7a00: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
7a10: 54 45 5f 55 54 46 38 3d 3d 31 20 26 26 20 53 51  TE_UTF8==1 && SQ
7a20: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32 20  LITE_UTF16LE==2 
7a30: 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  && SQLITE_UTF16B
7a40: 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74  E==3 );.  assert
7a50: 28 20 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55 54  ( enc>=SQLITE_UT
7a60: 46 38 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49 54  F8 && enc<=SQLIT
7a70: 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69  E_UTF16BE );.  i
7a80: 66 28 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  f( pColl ) pColl
7a90: 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65 74   += enc-1;.  ret
7aa0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
7ab0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 27  .** Invoke the '
7ac0: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
7ad0: 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72 65  ' callback to re
7ae0: 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74 69 6f  quest a collatio
7af0: 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69 6e  n sequence.** in
7b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 65   the database te
7b10: 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 6e  xt encoding of n
7b20: 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ame zName, lengt
7b30: 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20 74  h nName..** If t
7b40: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
7b50: 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20  uence.*/.static 
7b60: 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65  void callCollNee
7b70: 64 65 64 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  ded(sqlite *db, 
7b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
7b90: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
7ba0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 78 43   assert( !db->xC
7bb0: 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64 62  ollNeeded || !db
7bc0: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
7bd0: 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30  );.  if( nName<0
7be0: 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65   ) nName = strle
7bf0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(zName);.  if( 
7c00: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
7c10: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
7c20: 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53  ternal = sqliteS
7c30: 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e  trNDup(zName, nN
7c40: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ame);.    if( !z
7c50: 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72  External ) retur
7c60: 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c  n;.    db->xColl
7c70: 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c  Needed(db->pColl
7c80: 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28  NeededArg, db, (
7c90: 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78  int)db->enc, zEx
7ca0: 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ternal);.    sql
7cb0: 69 74 65 46 72 65 65 28 7a 45 78 74 65 72 6e 61  iteFree(zExterna
7cc0: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  l);.  }.  if( db
7cd0: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
7ce0: 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  ){.    char cons
7cf0: 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20  t *zExternal;.  
7d00: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
7d10: 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47  *pTmp = sqlite3G
7d20: 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65  etTransientValue
7d30: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
7d40: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 54 6d  3ValueSetStr(pTm
7d50: 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53 51  p, -1, zName, SQ
7d60: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
7d70: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a  E_STATIC);.    z
7d80: 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74  External = sqlit
7d90: 65 33 56 61 6c 75 65 54 65 78 74 28 70 54 6d 70  e3ValueText(pTmp
7da0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7db0: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 21  TIVE);.    if( !
7dc0: 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75  zExternal ) retu
7dd0: 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c  rn;.    db->xCol
7de0: 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43  lNeeded16(db->pC
7df0: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62  ollNeededArg, db
7e00: 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20  , (int)db->enc, 
7e10: 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a  zExternal);.  }.
7e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7e30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7e40: 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  if the collation
7e50: 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73 20 74   factory fails t
7e60: 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63  o deliver a.** c
7e70: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
7e80: 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20 65 6e  n in the best en
7e90: 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65 72 65  coding but there
7ea0: 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20 76 65   may be other ve
7eb0: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69  rsions.** of thi
7ec0: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  s collation func
7ed0: 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65 72 20  tion (for other 
7ee0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 20  text encodings) 
7ef0: 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f  available. Use o
7f00: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65 20 69  ne.** of these i
7f10: 6e 73 74 65 61 64 20 69 66 20 74 68 65 79 20 65  nstead if they e
7f20: 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20 55 54  xist. Avoid a UT
7f30: 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63  F-8 <-> UTF-16 c
7f40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20  onversion if.** 
7f50: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61  possible..*/.sta
7f60: 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c  tic int synthCol
7f70: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
7f80: 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
7f90: 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ll){.  CollSeq *
7fa0: 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a  pColl2;.  char *
7fb0: 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  z = pColl->zName
7fc0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  ;.  int n = strl
7fd0: 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 20  en(z);.  sqlite 
7fe0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7ff0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
8000: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e  tic const u8 aEn
8010: 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55  c[] = { SQLITE_U
8020: 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55  TF16BE, SQLITE_U
8030: 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55  TF16LE, SQLITE_U
8040: 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30  TF8 };.  for(i=0
8050: 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<3; i++){.   
8060: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
8070: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
8080: 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20   aEnc[i], z, n, 
8090: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
80a0: 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20  l2->xCmp!=0 ){. 
80b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
80c0: 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f  l, pColl2, sizeo
80d0: 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20  f(CollSeq));.   
80e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
80f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
8100: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
8110: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
8120: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70  te3SetNString(&p
8130: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
8140: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
8150: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 22 2c 20  on sequence: ", 
8160: 0a 20 20 20 20 20 20 20 20 2d 31 2c 20 7a 2c 20  .        -1, z, 
8170: 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 50 61  n, 0);.  }.  pPa
8180: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72  rse->nErr++;.  r
8190: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
81a0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OR;.}../*.** Thi
81b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
81c0: 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69  led on a collati
81d0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65 66 6f  on sequence befo
81e0: 72 65 20 69 74 20 69 73 20 75 73 65 64 20 74 6f  re it is used to
81f0: 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69  .** check that i
8200: 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20 41 6e  t is defined. An
8210: 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61   undefined colla
8220: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 65 78  tion sequence ex
8230: 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64  ists when.** a d
8240: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61 64 65  atabase is loade
8250: 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  d that contains 
8260: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
8270: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8280: 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6e  s.** that have n
8290: 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ot been defined 
82a0: 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  by sqlite3_creat
82b0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74  e_collation() et
82c0: 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75  c..**.** If requ
82d0: 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
82e0: 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27 63 6f  ne calls the 'co
82f0: 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20  llation needed' 
8300: 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72  callback to.** r
8310: 65 71 75 65 73 74 20 61 20 64 65 66 69 6e 69 74  equest a definit
8320: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ion of the colla
8330: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 49  ting sequence. I
8340: 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 77  f this doesn't w
8350: 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69  ork, .** an equi
8360: 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  valent collating
8370: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 75   sequence that u
8380: 73 65 73 20 61 20 74 65 78 74 20 65 6e 63 6f 64  ses a text encod
8390: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
83a0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64   from the main d
83b0: 61 74 61 62 61 73 65 20 69 73 20 73 75 62 73 74  atabase is subst
83c0: 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65 20 69  ituted, if one i
83d0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
83e0: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
83f0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
8400: 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a  Parse, CollSeq *
8410: 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43  pColl){.  if( pC
8420: 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78  oll && !pColl->x
8430: 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  Cmp ){.    /* No
8440: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8450: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
8460: 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69   for this encodi
8470: 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ng is registered
8480: 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68  ..    ** Call th
8490: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
84a0: 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74  ory to see if it
84b0: 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77   can supply us w
84c0: 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a  ith one..    */.
84d0: 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64      callCollNeed
84e0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ed(pParse->db, p
84f0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  Coll->zName, str
8500: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
8510: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  ));.    if( !pCo
8520: 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74  ll->xCmp && synt
8530: 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  hCollSeq(pParse,
8540: 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pColl) ){.     
8550: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8560: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
8570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8580: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  OK;.}../*.** Cal
8590: 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  l sqlite3CheckCo
85a0: 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c 20  llSeq() for all 
85b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
85c0: 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c  ces in an index,
85d0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
85e0: 76 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  verify that all 
85f0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
8600: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8610: 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e  s are.** loaded.
8620: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
8630: 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71  heckIndexCollSeq
8640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8650: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
8660: 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
8670: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
8680: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
8690: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
86a0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
86b0: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
86c0: 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
86d0: 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20  Coll[i]) ){.    
86e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
8700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8710: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8720: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
8730: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
8740: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
8750: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
8760: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
8770: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
8780: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
8790: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
87a0: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
87b0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
87c0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
87d0: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
87e0: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
87f0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
8800: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
8810: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
8820: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
8830: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
8840: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
8850: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
8860: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
8870: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
8880: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
8890: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
88a0: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
88b0: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
88c0: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
88d0: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
88e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
88f0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
8900: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
8910: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
8920: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
8930: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
8940: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
8950: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
8960: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
8970: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
8980: 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  arse..*/.CollSeq
8990: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
89a0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
89b0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
89c0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
89d0: 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20 3d 20  me){.  u8 enc = 
89e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
89f0: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
8a00: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69   pParse->db->ini
8a10: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
8a20: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
8a30: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50  e3FindCollSeq(pP
8a40: 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a  arse->db, enc, z
8a50: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69  Name, nName, ini
8a60: 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69  tbusy);.  if( !i
8a70: 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f  nitbusy && (!pCo
8a80: 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll || !pColl->xC
8a90: 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  mp) ){.    /* No
8aa0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8ab0: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
8ac0: 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64 69   for this encodi
8ad0: 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ng is registered
8ae0: 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68  ..    ** Call th
8af0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
8b00: 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69 74  ory to see if it
8b10: 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20 77   can supply us w
8b20: 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a  ith one..    */.
8b30: 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64      callCollNeed
8b40: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ed(pParse->db, z
8b50: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
8b60: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
8b70: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
8b80: 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e  rse->db, enc, zN
8b90: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
8ba0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
8bb0: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b   !pColl->xCmp ){
8bc0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
8bd0: 6d 61 79 20 62 65 20 61 20 76 65 72 73 69 6f 6e  may be a version
8be0: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
8bf0: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
8c00: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
8c10: 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65  * translation be
8c20: 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e  tween encodings.
8c30: 20 53 65 61 72 63 68 20 66 6f 72 20 69 74 20 77   Search for it w
8c40: 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  ith synthCollSeq
8c50: 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
8c60: 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c     if( synthColl
8c70: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
8c80: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  l) ){.        re
8c90: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
8ca0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8cb0: 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73 20 62  If nothing has b
8cc0: 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69 74 65  een found, write
8cd0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
8ce0: 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20 2a  ge into pParse *
8cf0: 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  /.  if( !initbus
8d00: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
8d10: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
8d20: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
8d30: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
8d40: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
8d50: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
8d60: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63  rMsg, "no such c
8d70: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8d80: 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  e: ", -1,.      
8d90: 20 20 20 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65      zName, nName
8da0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8db0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
8dc0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
8dd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
8de0: 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63  l;.}..../*.** Sc
8df0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8e00: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8e10: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8e20: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8e30: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8e40: 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68 61 72  ty type..*/.char
8e50: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8e60: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
8e70: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
8e80: 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a  e){.  int n, i;.
8e90: 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63    struct {.    c
8ea0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b  onst char *zSub;
8eb0: 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75    /* Keywords su
8ec0: 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63  bstring to searc
8ed0: 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61  h for */.    cha
8ee0: 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20  r nSub;         
8ef0: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75  /* length of zSu
8f00: 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66  b */.    char af
8f10: 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41  finity;     /* A
8f20: 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72  ffinity to retur
8f30: 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20  n if it matches 
8f40: 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67  */.  } substring
8f50: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e  s[] = {.    {"IN
8f60: 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41  T",  3, SQLITE_A
8f70: 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20  FF_INTEGER},.   
8f80: 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c   {"CHAR", 4, SQL
8f90: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
8fa0: 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53     {"CLOB", 4, S
8fb0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
8fc0: 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c  .    {"TEXT", 4,
8fd0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8fe0: 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20  },.    {"BLOB", 
8ff0: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  4, SQLITE_AFF_NO
9000: 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28  NE},.  };..  if(
9010: 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   nType==0 ){.   
9020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
9030: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66  FF_NONE;.  }.  f
9040: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
9050: 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a  (substrings)/siz
9060: 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30  eof(substrings[0
9070: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ]); i++){.    in
9080: 74 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67  t c1 = substring
9090: 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20  s[i].zSub[0];.  
90a0: 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77    int c2 = tolow
90b0: 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20  er(c1);.    int 
90c0: 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20  limit = nType - 
90d0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53  substrings[i].nS
90e0: 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ub;.    const ch
90f0: 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e  ar *z = substrin
9100: 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20  gs[i].zSub;.    
9110: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69  for(n=0; n<=limi
9120: 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; n++){.      i
9130: 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b  nt c = zType[n];
9140: 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63  .      if( (c==c
9150: 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20  1 || c==c2).    
9160: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
9170: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
9180: 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62  zType[n], z, sub
9190: 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29  strings[i].nSub)
91a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
91b0: 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d  rn substrings[i]
91c0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
91d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
91e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
91f0: 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a  _NUMERIC;.}../*.
9200: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9210: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
9220: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
9230: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
9240: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
9250: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
9260: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
9270: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
9280: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
9290: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
92a0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
92b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
92c0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
92d0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
92e0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
92f0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9300: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9310: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9320: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9330: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9340: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9350: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9360: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9370: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9380: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9390: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
93a0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
93b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
93c0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
93d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
93e0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
93f0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9400: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9410: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9420: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9430: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9440: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9450: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9460: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9470: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9480: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9490: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
94a0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
94b0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
94c0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
94d0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
94e0: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64  Cookie(sqlite *d
94f0: 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  b, Vdbe *v, int 
9500: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  iDb){.  sqlite3V
9510: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9520: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
9530: 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
9540: 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  ie+1, 0);.  sqli
9550: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9560: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
9570: 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, 0);.}../*.** 
9580: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
9590: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
95a0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
95b0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
95c0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
95d0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
95e0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
95f0: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
9600: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
9610: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
9620: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
9630: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
9640: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
9650: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
9660: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
9670: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
9680: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
9690: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
96a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
96b0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
96c0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
96d0: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
96e0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
96f0: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
9700: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
9710: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
9720: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
9730: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
9740: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
9750: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
9760: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
9770: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
9780: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
9790: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
97a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
97b0: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
97c0: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
97d0: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
97e0: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
97f0: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
9800: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
9810: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
9820: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
9830: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
9840: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
9850: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
9860: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
9870: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
9880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9890: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
98a0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
98b0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
98c0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
98d0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
98e0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
98f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
9900: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
9910: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
9920: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
9930: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
9940: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
9950: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
9960: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
9970: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
9980: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
9990: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
99a0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
99b0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
99c0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
99d0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
99e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
99f0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
9a00: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9a10: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
9a20: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
9a30: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9a40: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
9a50: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
9a60: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
9a70: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
9a80: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
9a90: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
9aa0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
9ab0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
9ac0: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
9ad0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
9ae0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
9af0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
9b00: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
9b10: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
9b20: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
9b30: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
9b40: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
9b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
9b60: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
9b70: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
9b80: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
9b90: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
9ba0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
9bb0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
9bc0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
9bd0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
9be0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
9bf0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
9c00: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
9c10: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
9c20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
9c30: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
9c40: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
9c50: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
9c60: 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43  , p->iDb==1 ? "C
9c70: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
9c80: 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41 42   " : "CREATE TAB
9c90: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72  LE ");.  k = str
9ca0: 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  len(zStmt);.  id
9cb0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
9cc0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
9cd0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
9ce0: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
9cf0: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
9d00: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
9d10: 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a  ){.    strcpy(&z
9d20: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
9d30: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
9d40: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
9d50: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
9d60: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
9d70: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
9d80: 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d  e);.    if( (z =
9d90: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30   pCol->zType)!=0
9da0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b   ){.      zStmt[
9db0: 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  k++] = ' ';.    
9dc0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
9dd0: 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20  k], z);.      k 
9de0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  += strlen(z);.  
9df0: 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79    }.  }.  strcpy
9e00: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64  (&zStmt[k], zEnd
9e10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
9e20: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
9e30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9e40: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
9e50: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
9e60: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
9e70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9e80: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
9e90: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
9ea0: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
9eb0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
9ec0: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
9ed0: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
9ee0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
9ef0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
9f00: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
9f10: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
9f20: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
9f30: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
9f40: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
9f50: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
9f60: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
9f70: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
9f80: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
9f90: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
9fa0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
9fb0: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
9fc0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
9fd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
9fe0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
9ff0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
a000: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
a010: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
a020: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
a030: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
a040: 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74  ly changes, so t
a050: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
a060: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
a070: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
a080: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a090: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
a0a0: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
a0b0: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
a0c0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
a0d0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
a0e0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
a0f0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
a100: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
a110: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
a120: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
a130: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
a140: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
a150: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
a160: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
a170: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
a180: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
a190: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
a1a0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
a1b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
a1c0: 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  ndTable(Parse *p
a1d0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45  Parse, Token *pE
a1e0: 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  nd, Select *pSel
a1f0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
a200: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
a210: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
a220: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
a230: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70  pSelect==0) || p
a240: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
a250: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
a260: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
a270: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
a280: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
a290: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
a2a0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
a2b0: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
a2c0: 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ct );..  /* If t
a2d0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
a2e0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
a2f0: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
a300: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
a310: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
a320: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
a330: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
a340: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
a350: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
a360: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
a370: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
a380: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
a390: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
a3a0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
a3b0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
a3c0: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
a3d0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
a3e0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
a3f0: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
a400: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
a410: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
a420: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
a430: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
a440: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
a450: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  um;.  }..  /* If
a460: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
a470: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
a480: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
a490: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
a4a0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
a4b0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
a4c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
a4d0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20  record number.  
a4e0: 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  ** for the new t
a4f0: 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c  able entry shoul
a500: 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20  d already be on 
a510: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a  the stack..  **.
a520: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
a530: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
a540: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
a550: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
a560: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
a570: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
a580: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
a590: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
a5a0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
a5b0: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
a5c0: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20      Vdbe *v;..  
a5d0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
a5e0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a5f0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
a600: 75 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  urn;..    if( p-
a610: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
a620: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
a630: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
a640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a650: 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  p(v, OP_CreateTa
a660: 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b  ble, p->iDb, 0);
a670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a680: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
a690: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a6a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
a6b0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
a6c0: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  }..    sqlite3Vd
a6d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
a6e0: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  ose, 0, 0);..   
a6f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
a700: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
a710: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20   AS SELECT ..., 
a720: 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45  execute the SELE
a730: 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  CT.    ** statem
a740: 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ent to populate 
a750: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  the new table. T
a760: 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  he root-page num
a770: 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ber for the.    
a780: 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  ** new table is 
a790: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
a7a0: 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20  e vdbe stack..  
a7b0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
a7c0: 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
a7d0: 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
a7e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
a7f0: 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
a800: 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
a810: 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
a820: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
a830: 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
a840: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
a850: 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
a860: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
a870: 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  ct ){.      Tabl
a880: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20  e *pSelTab;.    
a890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a8a0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
a8b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a8c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a8d0: 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44  P_Integer, p->iD
a8e0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, 0);.      sql
a8f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a900: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
a910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 0);.      pPar
a920: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
a930: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
a940: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
a950: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c  t, SRT_Table, 1,
a960: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
a970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a980: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
a990: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
a9a0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
a9b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
a9c0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
a9d0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
a9e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c  (pParse, 0, pSel
a9f0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ect);.        if
aa00: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
aa10: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61  eturn;.        a
aa20: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
aa30: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
aa40: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
aa50: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  nCol;.        p-
aa60: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
aa70: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >aCol;.        p
aa80: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
aa90: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
aaa0: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
aab0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
aac0: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
aad0: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
aae0: 20 7d 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65   }.  .    sqlite
aaf0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
ab00: 28 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 20 20  (v, p->iDb);..  
ab10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ab20: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
ab30: 30 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63 74  0, 0, p->pSelect
ab40: 3d 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76 69 65  ==0?"table":"vie
ab50: 77 22 2c 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  w",P3_STATIC);. 
ab60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ab70: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
ab80: 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c   0, 0, p->zName,
ab90: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
aba0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
abb0: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e  ring8, 0, 0, p->
abc0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
abd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
abe0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 33 2c 20 30  v, OP_Pull, 3, 0
abf0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 6c  );..    if( pSel
ac00: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ect ){.      cha
ac10: 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62  r *z = createTab
ac20: 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20  leStmt(p);.     
ac30: 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28   n = z ? strlen(
ac40: 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71  z) : 0;.      sq
ac50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ac60: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
ac70: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ac80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ac90: 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  , -1, z, n);.   
aca0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
acb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
acc0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
acd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
ace0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
acf0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
ad00: 20 22 43 52 45 41 54 45 20 56 49 45 57 20 22 2c   "CREATE VIEW ",
ad10: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
ad20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ad30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ad40: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
ad50: 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20 54 41  0, 0, "CREATE TA
ad60: 42 4c 45 20 22 2c 20 50 33 5f 53 54 41 54 49 43  BLE ", P3_STATIC
ad70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ad80: 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30   assert( pEnd!=0
ad90: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64   );.      n = Ad
ada0: 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
adb0: 64 72 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  dr(pParse->sName
adc0: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
add0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ade0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
adf0: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
ae00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ae10: 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP3(v, -1, pPar
ae20: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
ae30: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
ae40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ae50: 4f 50 5f 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30  OP_Concat8, 2, 0
ae60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ae70: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ae80: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
ae90: 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f   0, "tttit", P3_
aea0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
aeb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aec0: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
aed0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
aee0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
aef0: 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20  , v, p->iDb);.  
af00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af10: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
af20: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
af30: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
af40: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e  ParseSchema, p->
af50: 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
af60: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
af70: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
af80: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
af90: 41 4d 49 43 29 3b 0a 0a 20 20 20 20 73 71 6c 69  AMIC);..    sqli
afa0: 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
afb0: 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
afc0: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
afd0: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
afe0: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
aff0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
b000: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
b010: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
b020: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
b030: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
b040: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
b050: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 44 62 20  *pFKey; .    Db 
b060: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
b070: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 70 4f 6c  p->iDb];.    pOl
b080: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
b090: 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c 48  nsert(&pDb->tblH
b0a0: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
b0b0: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
b0c0: 31 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  1, p);.    if( p
b0d0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
b0e0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
b0f0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
b100: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
b110: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
b120: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
b130: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
b140: 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70  FKey=p->pFKey; p
b150: 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65  FKey; pFKey=pFKe
b160: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20  y->pNextFrom){. 
b170: 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73       int nTo = s
b180: 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f  trlen(pFKey->zTo
b190: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b  ) + 1;.      pFK
b1a0: 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71  ey->pNextTo = sq
b1b0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
b1c0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
b1d0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
b1e0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
b1f0: 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65 79  sert(&pDb->aFKey
b200: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
b210: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
b220: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
b230: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
b240: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
b250: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
b260: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
b270: 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ges;.  }.}../*.*
b280: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
b290: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
b2a0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
b2b0: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
b2c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
b2d0: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
b2e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
b2f0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
b300: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
b310: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
b320: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
b330: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
b340: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b350: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
b360: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
b370: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
b380: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
b390: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b3a0: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
b3b0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b3c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b3d0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
b3e0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
b3f0: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
b400: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
b410: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
b420: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
b430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
b440: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
b450: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
b460: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
b470: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
b480: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  d char *z;.  Tok
b490: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
b4a0: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
b4b0: 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69   *pName;..  sqli
b4c0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
b4d0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
b4e0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
b4f0: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
b500: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b510: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
b520: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
b530: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b540: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b550: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b560: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
b570: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
b580: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
b590: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
b5a0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
b5b0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
b5c0: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
b5d0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
b5e0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
b5f0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
b600: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b610: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b620: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b630: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
b640: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
b650: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
b660: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
b670: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
b680: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
b690: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
b6a0: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
b6b0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
b6c0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
b6d0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
b6e0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
b6f0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
b700: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
b710: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
b720: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
b730: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
b740: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
b750: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
b760: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b770: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
b780: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
b790: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
b7a0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
b7b0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
b7c0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
b7d0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
b7e0: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
b7f0: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
b800: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
b810: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
b820: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
b830: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
b840: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
b850: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
b860: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
b870: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
b880: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
b890: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
b8a0: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
b8b0: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
b8c0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
b8d0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
b8e0: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
b8f0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
b900: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
b910: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
b920: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
b930: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
b940: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
b950: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
b960: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
b970: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
b980: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
b990: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
b9a0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
b9b0: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
b9c0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
b9d0: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
b9e0: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
b9f0: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
ba00: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
ba10: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
ba20: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
ba30: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
ba40: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
ba50: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
ba60: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
ba70: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
ba80: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
ba90: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
baa0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
bab0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
bac0: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
bad0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
bae0: 54 61 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69  Table){.  ExprLi
baf0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65  st *pEList;.  Se
bb00: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61  lect *pSel;.  Ta
bb10: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
bb20: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
bb30: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
bb40: 29 3b 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  );..  /* A posit
bb50: 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
bb60: 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
bb70: 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
bb80: 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
bb90: 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
bba0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
bbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
bbc0: 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
bbd0: 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
bbe0: 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
bbf0: 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
bc00: 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
bc10: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
bc20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
bc30: 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
bc40: 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
bc50: 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
bc60: 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
bc70: 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
bc80: 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
bc90: 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
bca0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
bcb0: 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
bcc0: 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
bcd0: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
bce0: 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
bcf0: 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
bd00: 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  ** Actually, thi
bd10: 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68  s error is caugh
bd20: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64  t previously and
bd30: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
bd40: 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75  g test.  ** shou
bd50: 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20  ld always fail. 
bd60: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61   But we will lea
bd70: 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a  ve it in place j
bd80: 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a  ust to be safe..
bd90: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
bda0: 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
bdb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bdc0: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
bdd0: 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
bde0: 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
bdf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
be00: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
be10: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
be20: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
be30: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
be40: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
be50: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
be60: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
be70: 74 20 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d  t ); /* If nCol=
be80: 3d 30 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20  =0, then pTable 
be90: 6d 75 73 74 20 62 65 20 61 20 56 49 45 57 20 2a  must be a VIEW *
bea0: 2f 0a 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c  /.  pSel = pTabl
beb0: 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  e->pSelect;..  /
bec0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
bed0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
bee0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
bef0: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
bf00: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
bf10: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ents in this lis
bf20: 74 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  t.  But we will 
bf30: 6e 65 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  need to restore 
bf40: 74 68 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61  the list.  ** ba
bf50: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
bf60: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
bf70: 20 61 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20   afterwards, so 
bf80: 77 65 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f  we save a copy o
bf90: 66 0a 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69  f.  ** the origi
bfa0: 6e 61 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20  nal in pEList.. 
bfb0: 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
bfc0: 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  Sel->pEList;.  p
bfd0: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  Sel->pEList = sq
bfe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
bff0: 28 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  (pEList);.  if( 
c000: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20  pSel->pEList==0 
c010: 29 7b 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c  ){.    pSel->pEL
c020: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
c030: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
c040: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
c050: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  .  }.  pTable->n
c060: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c  Col = -1;.  pSel
c070: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
c080: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
c090: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
c0a0: 0a 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29  .  if( pSelTab )
c0b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
c0c0: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
c0d0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
c0e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
c0f0: 6c 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  l;.    pTable->a
c100: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
c110: 43 6f 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  Col;.    pSelTab
c120: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
c130: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
c140: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  0;.    sqlite3De
c150: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
c160: 6c 54 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74  lTab);.    DbSet
c170: 50 72 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d  Property(pParse-
c180: 3e 64 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62  >db, pTable->iDb
c190: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
c1a0: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
c1b0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
c1c0: 30 3b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  0;.    nErr++;. 
c1d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
c1e0: 63 74 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a  ctUnbind(pSel);.
c1f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
c200: 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45  tDelete(pSel->pE
c210: 4c 69 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70  List);.  pSel->p
c220: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
c230: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
c240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
c250: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
c260: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
c270: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
c280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c290: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
c2a0: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  All(sqlite *db, 
c2b0: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
c2c0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
c2d0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
c2e0: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
c2f0: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
c300: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
c310: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
c320: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
c330: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
c340: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
c350: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
c360: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
c370: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
c380: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
c390: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
c3a0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
c3b0: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
c3c0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
c3d0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
c3e0: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  s);.}../*.** Thi
c3f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c400: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
c410: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
c420: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
c430: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
c440: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
c450: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
c460: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
c470: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
c480: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
c490: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
c4a0: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
c4b0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
c4c0: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
c4d0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
c4e0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
c4f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c500: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
c510: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
c520: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c530: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
c540: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
c550: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
c560: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
c570: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
c580: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
c590: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
c5a0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
c5b0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c5c0: 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
c5d0: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  Tab->iDb;.  asse
c5e0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
c5f0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
c600: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c610: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
c620: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
c630: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c640: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
c650: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b  ABLE(pTab->iDb);
c660: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c670: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
c680: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
c690: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c6a0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c6b0: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
c6c0: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
c6d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c6e0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
c6f0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
c700: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
c710: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
c720: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
c730: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
c740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c750: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
c760: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
c770: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c780: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
c790: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
c7a0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
c7b0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
c7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c7d0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
c7e0: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
c7f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c800: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
c810: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
c820: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
c830: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c840: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c850: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
c860: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c870: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c880: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
c890: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
c8a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c8b0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
c8c0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c8d0: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
c8e0: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
c8f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c900: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
c910: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
c920: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
c930: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
c940: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
c950: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
c960: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
c970: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
c980: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c990: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c9a0: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
c9b0: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
c9c0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
c9d0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
c9e0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
c9f0: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
ca00: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
ca10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ca20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ca30: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
ca40: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
ca50: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
ca60: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ca70: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
ca80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
ca90: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
caa0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
cab0: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
cac0: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
cad0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
cae0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
caf0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
cb00: 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64  tic VdbeOpList d
cb10: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
cb20: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
cb30: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 33  ,     0, ADDR(13
cb40: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
cb50: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
cb60: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
cb70: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
cb80: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
cb90: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
cba0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
cbb0: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
cbc0: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
cbd0: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
cbe0: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
cbf0: 20 20 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65     0}, /* sqlite
cc00: 5f 6d 61 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65  _master.tbl_name
cc10: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
cc20: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
cc30: 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20  DR(12), 0},.    
cc40: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
cc50: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
cc60: 22 74 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20  "trigger"},.    
cc70: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
cc80: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
cc90: 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  0}, /* sqlite_ma
cca0: 73 74 65 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20  ster.type */.   
ccb0: 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20     { OP_Eq,     
ccc0: 20 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c      0, ADDR(12),
ccd0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cce0: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
ccf0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
cd00: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
cd10: 20 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c      0, ADDR(13),
cd20: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cd30: 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41  Goto,       0, A
cd40: 44 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(3),  0},.   
cd50: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
cd60: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
cd70: 20 30 7d 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20   0}, /* 12 */.  
cd80: 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a    };.    Index *
cd90: 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65  pIdx;.    Trigge
cda0: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
cdb0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
cdc0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
cdd0: 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62  se, 0, pTab->iDb
cde0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
cdf0: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
ce00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
ce10: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
ce20: 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
ce30: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
ce40: 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
ce50: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
ce60: 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
ce70: 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
ce80: 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
ce90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
cea0: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
ceb0: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
cec0: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
ced0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
cee0: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62  igger->iDb==pTab
cef0: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
cf00: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
cf10: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
cf20: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
cf30: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
cf40: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
cf50: 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
cf60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
cf70: 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
cf80: 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
cf90: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
cfa0: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
cfb0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
cfc0: 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
cfd0: 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
cfe0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
cff0: 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
d000: 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
d010: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
d020: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
d030: 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
d040: 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
d050: 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
d060: 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
d070: 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
d080: 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
d090: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
d0a0: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
d0b0: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
d0c0: 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
d0d0: 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
d0e0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
d0f0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
d100: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69  Table(v, pTab->i
d110: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
d120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d130: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
d140: 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72  e(dropTable), dr
d150: 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71  opTable);.    sq
d160: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d170: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61  3(v, base+1, pTa
d180: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
d190: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
d1a0: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 54 61  ookie(db, v, pTa
d1b0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  b->iDb);.    sql
d1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d1d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
d1e0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
d1f0: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
d200: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d210: 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 2d  P_Destroy, pTab-
d220: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62  >tnum, pTab->iDb
d230: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
d240: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d250: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d260: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
d270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d280: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
d290: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64   pIdx->tnum, pId
d2a0: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  x->iDb);.      }
d2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d2c0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
d2d0: 44 72 6f 70 54 61 62 6c 65 2c 20 70 54 61 62 2d  DropTable, pTab-
d2e0: 3e 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  >iDb, 0, pTab->z
d2f0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
d300: 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
d310: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a  ration(pParse);.
d320: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
d330: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
d340: 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
d350: 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
d360: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
d370: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
d380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d390: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
d3a0: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
d3b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
d3c0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
d3d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
d3e0: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
d3f0: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
d400: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
d410: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
d420: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
d430: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
d440: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
d450: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
d460: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
d470: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
d480: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
d490: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
d4a0: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
d4b0: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
d4c0: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
d4d0: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
d4e0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
d4f0: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
d500: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
d510: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
d520: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
d530: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
d540: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
d550: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
d560: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
d570: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
d580: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
d590: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
d5a0: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
d5b0: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
d5c0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
d5d0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
d5e0: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
d5f0: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
d600: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
d610: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
d620: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
d630: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
d640: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
d650: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
d660: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
d670: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
d680: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
d690: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
d6a0: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
d6b0: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
d6c0: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
d6d0: 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
d6e0: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
d6f0: 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
d700: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
d710: 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
d720: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d730: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d740: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d750: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
d760: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
d770: 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
d780: 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
d790: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
d7a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
d7b0: 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
d7c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
d7d0: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
d7e0: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
d7f0: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
d800: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
d810: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
d820: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
d830: 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
d840: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
d850: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d860: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
d870: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
d880: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  l;.  char *z;.  
d890: 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
d8a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
d8b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
d8c0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
d8d0: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
d8e0: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
d8f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
d900: 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
d910: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
d920: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
d930: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
d940: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
d950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d960: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d970: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
d980: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
d990: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
d9a0: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
d9b0: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
d9c0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
d9d0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
d9e0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
d9f0: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
da00: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
da10: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
da20: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
da30: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
da40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
da50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
da60: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
da70: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
da80: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
da90: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
daa0: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
dab0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
dac0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
dad0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
dae0: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
daf0: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
db00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
db10: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
db20: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
db30: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
db40: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
db50: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
db60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
db70: 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
db80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
db90: 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
dba0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
dbb0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
dbc0: 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
dbd0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
dbe0: 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
dbf0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
dc00: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
dc10: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
dc20: 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
dc30: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
dc40: 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
dc50: 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
dc60: 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
dc70: 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
dc80: 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
dc90: 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
dca0: 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
dcb0: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
dcc0: 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
dcd0: 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
dce0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
dcf0: 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
dd00: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
dd10: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
dd20: 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
dd30: 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
dd40: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
dd50: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
dd60: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
dd70: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
dd80: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
dd90: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
dda0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ddb0: 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
ddc0: 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
ddd0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
dde0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
ddf0: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
de00: 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
de10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
de20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
de30: 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
de40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
de50: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
de60: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
de70: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
de80: 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
de90: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
dea0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
deb0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
dec0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
ded0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
dee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
def0: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
df00: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
df10: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
df20: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
df30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
df40: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
df50: 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
df60: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
df70: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
df80: 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
df90: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
dfa0: 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
dfb0: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
dfc0: 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
dfd0: 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
dfe0: 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
dff0: 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
e000: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
e010: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
e020: 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
e030: 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
e040: 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
e050: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
e060: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
e070: 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
e080: 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
e090: 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
e0a0: 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
e0b0: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
e0c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
e0d0: 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d  ListDelete(pFrom
e0e0: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
e0f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54  xprListDelete(pT
e100: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
e110: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e120: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
e130: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
e140: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
e150: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
e160: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
e170: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
e180: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
e190: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
e1a0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
e1b0: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
e1c0: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
e1d0: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
e1e0: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
e1f0: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
e200: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
e210: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
e220: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
e230: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
e240: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
e250: 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
e260: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e270: 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61  sDeferred){.  Ta
e280: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
e290: 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
e2a0: 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
e2b0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
e2c0: 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
e2d0: 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
e2e0: 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
e2f0: 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
e300: 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rred;.}../*.** C
e310: 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
e320: 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
e330: 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
e340: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
e350: 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
e360: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
e370: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
e380: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
e390: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
e3a0: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
e3b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
e3c0: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
e3d0: 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
e3e0: 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
e3f0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
e400: 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
e410: 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
e420: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e430: 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
e440: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
e450: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
e460: 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
e470: 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
e480: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
e490: 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
e4a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
e4b0: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
e4c0: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
e4d0: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
e4e0: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
e4f0: 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
e500: 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
e510: 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
e520: 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
e530: 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
e540: 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
e550: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
e560: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
e570: 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
e580: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
e590: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
e5a0: 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  rse,   /* All in
e5b0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
e5c0: 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
e5d0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
e5e0: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
e5f0: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
e600: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
e610: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
e620: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
e630: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
e640: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
e650: 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
e660: 2c 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  ,  /* Table to i
e670: 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
e680: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
e690: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e6a0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
e6b0: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
e6c0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
e6d0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
e6e0: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
e6f0: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
e700: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
e710: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
e720: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
e730: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
e740: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
e750: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
e760: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
e770: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
e780: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
e790: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
e7a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
e7b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e7c0: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
e7d0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
e7e0: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
e7f0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
e800: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
e810: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
e820: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
e830: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
e840: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
e850: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
e860: 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
e870: 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20  sFix;    /* For 
e880: 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
e890: 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
e8a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  le */.  int isTe
e8b0: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp;      /* True
e8c0: 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
e8d0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69   index */.  sqli
e8e0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
e8f0: 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b  >db;..  int iDb;
e900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
e910: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
e920: 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
e930: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
e940: 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
e950: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
e960: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
e970: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
e980: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e990: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
e9a0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
e9b0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
e9c0: 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
e9d0: 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
e9e0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
e9f0: 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
ea00: 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
ea10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
ea20: 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
ea30: 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
ea40: 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
ea50: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
ea60: 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
ea70: 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
ea80: 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
ea90: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
eaa0: 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
eab0: 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
eac0: 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
ead0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
eae0: 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
eaf0: 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
eb00: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
eb10: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
eb20: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
eb30: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
eb40: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
eb50: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
eb60: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
eb70: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
eb80: 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
eb90: 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
eba0: 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
ebb0: 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
ebc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
ebd0: 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
ebe0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
ebf0: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
ec00: 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
ec10: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
ec20: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
ec30: 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
ec40: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
ec50: 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  b = 1;.    }..  
ec60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
ec70: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
ec80: 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22  se, iDb, "index"
ec90: 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20  , pName) &&.    
eca0: 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72      sqlite3FixSr
ecb0: 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
ecc0: 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  lName).    ){.  
ecd0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
ece0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
ecf0: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
ed00: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
ed10: 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
ed20: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
ed30: 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
ed40: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
ed50: 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
ed60: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
ed70: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
ed80: 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d  sert( iDb==pTab-
ed90: 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  >iDb );.  }else{
eda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
edb0: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
edc0: 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
edd0: 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20  wTable;.    iDb 
ede0: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d  = pTab->iDb;.  }
edf0: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
ee00: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
ee10: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
ee20: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
ee30: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
ee40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
ee50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
ee60: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
ee70: 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
ee80: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
ee90: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
eea0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
eeb0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
eec0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
eed0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
eee0: 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
eef0: 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
ef00: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
ef10: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54  index;.  }.  isT
ef20: 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d  emp = pTab->iDb=
ef30: 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  =1;..  /*.  ** F
ef40: 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
ef50: 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
ef60: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
ef70: 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
ef80: 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
ef90: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
efa0: 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
efb0: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
efc0: 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
efd0: 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
efe0: 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
eff0: 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
f000: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
f010: 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
f020: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
f030: 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
f040: 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
f050: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
f060: 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
f070: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
f080: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
f090: 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
f0a0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
f0b0: 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
f0c0: 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
f0d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
f0e0: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
f0f0: 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
f100: 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
f110: 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
f120: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
f130: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
f140: 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
f150: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
f160: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
f170: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
f180: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
f190: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
f1a0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
f1b0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
f1c0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
f1d0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
f1e0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
f1f0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
f200: 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ex;.    if( SQLI
f210: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
f220: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
f230: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
f240: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f250: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f260: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
f270: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f280: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d      Index *pISam
f290: 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f  eName;    /* Ano
f2a0: 74 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20  ther index with 
f2b0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f  the same name */
f2c0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
f2d0: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
f2e0: 41 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d  A table with sam
f2f0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e  e name as the in
f300: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
f310: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
f320: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
f330: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
f340: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f350: 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61 6d        if( (pISam
f360: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
f370: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
f380: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
f390: 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20  .zName))!=0 ){. 
f3a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
f3b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f3c0: 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
f3d0: 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
f3e0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
f3f0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
f400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f410: 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20  if( (pTSameName 
f420: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
f430: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
f440: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
f450: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f460: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
f470: 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
f480: 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
f490: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
f4a0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
f4b0: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
f4c0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
f4d0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63  Name==0 ){.    c
f4e0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
f4f0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
f500: 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
f510: 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
f520: 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
f530: 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
f540: 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
f550: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
f560: 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61  _%d",n);.    zNa
f570: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
f580: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
f590: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
f5a0: 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e  oindex_", pTab->
f5b0: 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68  zName, zBuf, (ch
f5c0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20  ar*)0);.    if( 
f5d0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
f5e0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f5f0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  x;.  }..  /* Che
f600: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
f610: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
f620: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
f630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f640: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f650: 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
f660: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
f670: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
f680: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
f690: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f6a0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
f6b0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
f6c0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
f6d0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f6e0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f6f0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
f700: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
f710: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73  NDEX;.    if( is
f720: 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54  Temp ) i = SQLIT
f730: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
f740: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
f750: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
f760: 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
f770: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
f780: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f790: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f7a0: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
f7b0: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
f7c0: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
f7d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
f7e0: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
f7f0: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
f800: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
f810: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
f820: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
f830: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
f840: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
f850: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
f860: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
f870: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
f880: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
f890: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
f8a0: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
f8b0: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
f8c0: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
f8d0: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
f8e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f8f0: 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
f900: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
f910: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
f920: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
f930: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
f940: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
f950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
f960: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
f970: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f980: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
f990: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
f9a0: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
f9b0: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
f9c0: 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
f9d0: 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73  (CollSeq*))*pLis
f9e0: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66  t->nExpr );.  if
f9f0: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f  ( pIndex==0 ) go
fa00: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
fa10: 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
fa20: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
fa30: 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
fa40: 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e  o.aColl[pList->n
fa50: 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  Expr];.  pIndex-
fa60: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
fa70: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
fa80: 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  n[pList->nExpr];
fa90: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
faa0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
fab0: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
fac0: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
fad0: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
fae0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
faf0: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
fb00: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
fb10: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
fb20: 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
fb30: 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20  x->iDb = iDb;.. 
fb40: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
fb50: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
fb60: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
fb70: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
fb80: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
fb90: 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
fba0: 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
fbb0: 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
fbc0: 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
fbd0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
fbe0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
fbf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
fc00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
fc10: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
fc20: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
fc30: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fc40: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
fc50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
fc60: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
fc70: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
fc80: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
fc90: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
fca0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fcb0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
fcc0: 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
fcd0: 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
fce0: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
fcf0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  e, pList->a[i].z
fd00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
fd10: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
fd20: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
fd30: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
fd40: 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
fd50: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
fd60: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
fd70: 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t( pList->a[i].p
fd80: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
fd90: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
fda0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
fdb0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
fdc0: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  r->pColl;.    }e
fdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  lse{.      pInde
fde0: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
fdf0: 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  [i] = pTab->aCol
fe00: 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].pColl;.    }
fe10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
fe20: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
fe30: 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28  ll[i] );.    if(
fe40: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
fe50: 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
fe60: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
fe70: 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
fe80: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
fe90: 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
fea0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
feb0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
fec0: 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  }.  pIndex->keyI
fed0: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69  nfo.nField = pLi
fee0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
fef0: 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
ff00: 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
ff10: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
ff20: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
ff30: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
ff40: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
ff50: 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
ff60: 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
ff70: 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
ff80: 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
ff90: 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
ffa0: 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
ffb0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
ffc0: 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
ffd0: 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
ffe0: 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
fff0: 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
10000 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
10010 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
10020 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
10030 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
10040 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
10050 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
10060 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
10070 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
10080 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
10090 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
100a0 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
100b0 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
100c0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
100d0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
100e0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
100f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
10100 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
10110 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
10120 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
10130 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
10140 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
10150 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
10160 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
10170 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
10180 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
10190 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
101a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
101b0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
101c0 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ne );.      asse
101d0 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e  rt( pIdx->autoIn
101e0 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dex );.      ass
101f0 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ert( pIndex->onE
10200 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
10210 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
10220 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65  ->nColumn!=pInde
10230 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  x->nColumn ) con
10240 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
10250 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43  (k=0; k<pIdx->nC
10260 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  olumn; k++){.   
10270 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
10280 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
10290 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
102a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
102b0 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e   if( pIdx->keyIn
102c0 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e  fo.aColl[k]!=pIn
102d0 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
102e0 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ll[k] ) break;. 
102f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10300 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
10310 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
10320 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
10330 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
10340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10350 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
10360 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
10370 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
10380 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
10390 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
103a0 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
103b0 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
103c0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
103d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
103e0 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
103f0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
10400 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
10410 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
10420 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
10430 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
10440 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
10450 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
10460 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
10470 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
10480 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
10490 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
104a0 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
104b0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
104c0 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
104d0 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
104e0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
104f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
10500 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
10510 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
10520 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
10530 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
10540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
10550 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10560 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
10570 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
10580 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
10590 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
105a0 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
105b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
105c0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
105d0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
105e0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
105f0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
10600 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
10610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10620 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
10630 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10650 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
10660 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
10670 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
10680 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
10690 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
106a0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
106b0 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
106c0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
106d0 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
106e0 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
106f0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
10700 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
10710 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20  Db].idxHash, .  
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
10740 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
10750 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
10760 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
10770 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
10780 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
10790 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
107a0 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
107b0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
107c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
107d0 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
107e0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
107f0 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
10800 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
10810 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
10820 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
10830 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
10840 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
10850 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
10860 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
10870 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
10880 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
10890 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
108a0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
108b0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
108c0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
108d0 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
108e0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
108f0 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
10900 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
10910 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
10920 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
10930 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
10940 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
10950 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
10960 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
10970 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
10980 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
10990 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
109a0 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
109b0 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
109c0 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
109d0 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
109e0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
109f0 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
10a00 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
10a10 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
10a20 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
10a30 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
10a40 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
10a50 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
10a60 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
10a70 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
10a80 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
10a90 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
10aa0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
10ab0 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
10ac0 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
10ad0 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
10ae0 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
10af0 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
10b00 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
10b10 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
10b20 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
10b30 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
10b40 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
10b50 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
10b60 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74  Vdbe *v;.    int
10b70 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 0a 20 20   lbl1, lbl2;..  
10b80 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10b90 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10ba0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
10bb0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10bc0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 62  dex;.    if( pTb
10bd0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
10be0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
10bf0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
10c00 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
10c10 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
10c20 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
10c30 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
10c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10c50 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30  , OP_NewRecno, 0
10c60 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10c70 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
10c80 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 69  tring8, 0, 0, "i
10c90 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43  ndex", P3_STATIC
10ca0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10cb0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
10cc0 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  ng8, 0, 0, pInde
10cd0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
10ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
10cf0 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
10d00 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10d10 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
10d20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10d30 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
10d40 44 62 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Db, 0);.    if( 
10d50 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
10d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10d70 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
10d80 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10d90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10da0 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
10db0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10dc0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
10dd0 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a  penWrite, 1, 0,.
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e       (char*)&pIn
10e00 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33  dex->keyInfo, P3
10e10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d  _KEYINFO);.    }
10e20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10e30 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
10e40 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
10e50 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
10e60 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nd ){.      if( 
10e70 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
10e80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10e90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
10ea0 76 2c 20 2d 31 2c 20 22 43 52 45 41 54 45 20 49  v, -1, "CREATE I
10eb0 4e 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49  NDEX ", P3_STATI
10ec0 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
10ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10ee0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
10ef0 2d 31 2c 20 22 43 52 45 41 54 45 20 55 4e 49 51  -1, "CREATE UNIQ
10f00 55 45 20 49 4e 44 45 58 20 22 2c 20 50 33 5f 53  UE INDEX ", P3_S
10f10 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
10f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f30 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
10f40 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
10f50 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
10f60 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d  ->z) - Addr(pNam
10f70 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  e->z) + 1;.     
10f80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f90 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61 6d  geP3(v, -1, pNam
10fa0 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  e->z, n);.      
10fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10fc0 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 38 2c 20  (v, OP_Concat8, 
10fd0 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2, 0);.    }.   
10fe0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10ff0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
11000 2c 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c  , 5, 0, "tttit",
11010 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
11020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11030 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
11040 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  y, 0, 0);.    if
11050 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
11060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11070 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
11080 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  er, pTab->iDb, 0
11090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
110a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
110b0 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61  OpenRead, 2, pTa
110c0 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  b->tnum);.      
110d0 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  /* VdbeComment((
110e0 76 2c 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a  v, "%s", pTab->z
110f0 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20  Name)); */.     
11100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11110 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
11120 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e  lumns, 2, pTab->
11130 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c  nCol);.      lbl
11140 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
11150 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
11160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11170 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
11180 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20  , 2, lbl2);.    
11190 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33    lbl1 = sqlite3
111a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
111b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
111c0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
111d0 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 32 29 3b  y(v, pIndex, 2);
111e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
111f0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 50  beOp3(v, OP_IdxP
11200 75 74 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f  ut, 1, pIndex->o
11210 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c  nError!=OE_None,
11220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11230 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20         "indexed 
11240 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
11250 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54  unique", P3_STAT
11260 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
11270 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11280 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29  P_Next, 2, lbl1)
11290 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
112a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
112b0 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  v, lbl2);.      
112c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c  (v, OP_Close, 2,
112e0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
112f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11300 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a  P_Close, 1, 0);.
11310 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
11320 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
11330 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
11340 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11350 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
11360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11370 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
11380 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
11390 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
113a0 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  , OP_ParseSchema
113b0 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20  , iDb, 0,.      
113c0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
113d0 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70  f("name='%q'", p
113e0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50  Index->zName), P
113f0 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  3_DYNAMIC);.    
11400 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
11410 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
11420 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
11430 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
11440 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
11450 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
11460 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
11470 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
11480 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
11490 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
114a0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
114b0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
114c0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
114d0 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
114e0 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
114f0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
11500 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
11510 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
11520 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
11530 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
11540 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
11550 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
11560 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
11570 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
11580 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
11590 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
115a0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
115b0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
115c0 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
115d0 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
115e0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
115f0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
11600 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
11610 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
11620 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
11630 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
11640 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
11650 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
11660 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
11670 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
11680 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
11690 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
116a0 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
116b0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
116c0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
116d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
116e0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
116f0 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
11700 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
11710 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
11720 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  e(pList);.  sqli
11730 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
11740 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  (pTblName);.  sq
11750 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
11760 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
11770 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11780 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
11790 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
117a0 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
117b0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
117c0 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
117d0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
117e0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
117f0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
11800 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
11810 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
11820 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
11830 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
11840 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
11850 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
11860 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
11870 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
11880 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
11890 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
118a0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
118b0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
118c0 70 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e  pParse) ) return
118d0 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
118e0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
118f0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
11900 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
11910 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
11920 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
11930 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11940 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
11950 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
11960 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
11970 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
11980 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
11990 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
119a0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
119b0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
119c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
119d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
119e0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
119f0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
11a00 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
11a10 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
11a20 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
11a30 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
11a40 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
11a50 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
11a60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11a70 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
11a80 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
11a90 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
11aa0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
11ab0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
11ac0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11ad0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
11ae0 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
11af0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11b00 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
11b10 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
11b20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
11b30 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11b40 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
11b50 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
11b60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11b70 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
11b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
11b90 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
11ba0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
11bb0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
11bc0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11bd0 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
11be0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
11bf0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
11c00 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
11c10 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
11c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
11c30 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
11c40 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
11c50 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
11c60 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
11c70 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
11c80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11c90 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
11ca0 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
11cb0 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78  OpList dropIndex
11cc0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
11cd0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
11ce0 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20   ADDR(9), 0}, . 
11cf0 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
11d00 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  8,    0, 0,     
11d10 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20    0}, /* 1 */.  
11d20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72      { OP_MemStor
11d30 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20  e,   1, 1,      
11d40 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11d50 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30  MemLoad,    1, 0
11d60 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33  ,       0}, /* 3
11d70 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43   */.      { OP_C
11d80 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c  olumn,     0, 1,
11d90 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
11da0 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20   { OP_Eq,       
11db0 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d    0, ADDR(8), 0}
11dc0 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78  ,.      { OP_Nex
11dd0 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  t,       0, ADDR
11de0 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (3), 0},.      {
11df0 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
11e00 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a  0, ADDR(9), 0},.
11e10 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
11e20 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
11e30 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20     0}, /* 8 */. 
11e40 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61     };.    int ba
11e50 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  se;..    sqlite3
11e60 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
11e70 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
11e80 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
11e90 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
11ea0 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65  erTable(v, pInde
11eb0 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73  x->iDb);.    bas
11ec0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
11ed0 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
11ee0 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29  ySize(dropIndex)
11ef0 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20  , dropIndex);.  
11f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11f10 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c  ngeP3(v, base+1,
11f20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
11f30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  0);.    sqlite3C
11f40 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
11f50 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  v, pIndex->iDb);
11f60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11f70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
11f80 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
11f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11fa0 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49  , OP_Destroy, pI
11fb0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64  ndex->tnum, pInd
11fc0 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71  ex->iDb);.    sq
11fd0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11fe0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 70 49  OP_DropIndex, pI
11ff0 6e 64 65 78 2d 3e 69 44 62 2c 20 30 2c 20 70 49  ndex->iDb, 0, pI
12000 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
12010 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57  .    sqlite3EndW
12020 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
12030 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  arse);.  }..exit
12040 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
12050 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
12060 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
12070 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
12080 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
12090 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
120a0 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
120b0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
120c0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
120d0 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
120e0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
120f0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
12100 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
12110 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
12120 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
12130 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
12140 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
12150 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
12160 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
12170 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
12180 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
12190 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
121a0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
121b0 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
121c0 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  Id>=pList->nAllo
121d0 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  c ){.    struct 
121e0 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  IdList_item *a;.
121f0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
12200 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
12210 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d  c*2 + 5;.    a =
12220 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
12230 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
12240 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c  nAlloc*sizeof(pL
12250 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
12260 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
12270 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
12280 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
12290 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
122a0 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
122b0 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65  >a = a;.  }.  me
122c0 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
122d0 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
122e0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
122f0 5d 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  ]));.  pList->a[
12300 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
12310 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
12320 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
12330 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  ;.  pList->nId++
12340 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
12350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
12360 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
12370 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
12380 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
12390 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
123a0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
123b0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
123c0 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
123d0 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
123e0 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
123f0 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
12400 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
12410 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
12420 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
12430 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
12440 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
12450 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
12460 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
12470 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
12480 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
12490 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
124a0 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
124b0 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
124c0 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
124d0 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
124e0 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
124f0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
12500 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
12510 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
12520 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
12530 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
12540 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
12550 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
12560 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
12570 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
12580 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
12590 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
125a0 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
125b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
125c0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
125d0 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
125e0 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
125f0 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
12600 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
12610 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
12620 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
12630 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
12640 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
12650 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
12660 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
12670 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
12680 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
12690 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
126a0 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
126b0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
126c0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
126d0 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
126e0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
126f0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
12700 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
12710 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
12720 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
12730 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
12740 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
12750 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
12760 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53  ase){.  struct S
12770 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
12780 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
12790 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
127a0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
127b0 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
127c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
127d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
127e0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
127f0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
12800 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
12810 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
12820 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
12830 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
12840 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
12850 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
12860 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
12870 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
12880 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
12890 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
128a0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
128b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
128c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
128d0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
128e0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
128f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
12900 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
12910 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
12920 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
12930 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
12940 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
12950 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
12960 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
12970 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
12980 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
12990 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
129a0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
129b0 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
129c0 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
129d0 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
129e0 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
129f0 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
12a00 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
12a10 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
12a20 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
12a30 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
12a40 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
12a50 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
12a60 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70  (pDatabase);.  p
12a70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
12a80 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72  -1;.  pList->nSr
12a90 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
12aa0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
12ab0 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20  sign cursors to 
12ac0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
12ad0 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
12ae0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
12af0 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
12b00 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
12b10 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
12b20 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12b30 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
12b40 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
12b50 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
12b60 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  <0 ){.      pLis
12b70 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  t->a[i].iCursor 
12b80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12ba0 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
12bb0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
12bc0 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
12bd0 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
12be0 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
12bf0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64  qlite3SrcListAdd
12c00 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
12c10 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
12c20 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
12c30 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
12c40 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  >0 ){.    pList-
12c50 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
12c60 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
12c70 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
12c80 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  pToken);.  }.}..
12c90 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
12ca0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
12cb0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
12cc0 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
12cd0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
12ce0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
12cf0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12d00 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
12d10 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
12d20 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
12d30 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
12d40 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
12d50 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
12d60 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
12d70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
12d80 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
12d90 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
12da0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
12db0 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
12dc0 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
12dd0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
12de0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
12df0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12e00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
12e10 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
12e20 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
12e30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
12e40 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
12e50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
12e60 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
12e70 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
12e80 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
12e90 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
12ea0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
12eb0 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
12ec0 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
12ed0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
12ee0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
12ef0 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
12f00 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
12f10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
12f20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
12f30 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
12f40 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
12f50 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
12f60 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
12f70 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
12f80 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
12f90 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
12fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12fb0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
12fc0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
12fd0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
12fe0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
12ff0 61 62 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61  ab && pItem->pTa
13000 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
13010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
13020 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49  eleteTable(0, pI
13030 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
13040 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
13050 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  ectDelete(pItem-
13060 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
13070 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
13080 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pItem->pOn);.  
13090 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
130a0 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73  elete(pItem->pUs
130b0 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
130c0 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
130d0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
130e0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
130f0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
13100 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
13110 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
13120 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
13130 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
13140 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
13150 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
13160 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
13170 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
13180 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
13190 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
131a0 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
131b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
131c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
131d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
131e0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
131f0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
13200 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13210 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
13220 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
13230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13240 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
13250 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
13260 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
13270 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
13280 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
13290 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
132a0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
132b0 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
132c0 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
132d0 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
132e0 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
132f0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
13300 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
13310 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
13320 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
13330 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
13340 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13350 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13360 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
13370 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
13380 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
13390 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
133a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
133b0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
133c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
133d0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
133e0 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
133f0 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
13400 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
13410 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
13420 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
13430 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
13440 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
13450 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
13460 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
13470 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
13480 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
13490 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
134a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
134b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
134c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
134d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
134e0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
134f0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
13500 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
13510 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
13520 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13530 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13540 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
13550 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13560 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
13570 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
13580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
13590 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
135a0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
135b0 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
135c0 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
135d0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
135e0 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
135f0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
13600 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
13610 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
13620 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
13630 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
13640 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
13650 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13660 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
13670 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
13680 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
13690 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
136a0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
136b0 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
136c0 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
136d0 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
136e0 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
136f0 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
13700 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
13710 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
13720 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
13730 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
13740 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
13750 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
13760 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
13770 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
13780 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
13790 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
137a0 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
137b0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
137c0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
137d0 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
137e0 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
137f0 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
13800 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
13810 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
13820 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
13830 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
13840 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
13850 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
13860 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
13870 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
13880 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
13890 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
138a0 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
138b0 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
138c0 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
138d0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
138e0 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
138f0 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
13900 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
13910 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
13920 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
13930 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
13940 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
13950 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
13960 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
13970 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
13980 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
13990 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
139a0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
139b0 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
139c0 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
139d0 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
139e0 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
139f0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
13a00 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
13a10 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
13a20 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
13a30 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
13a40 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
13a50 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13a60 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
13a70 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
13a80 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
13a90 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
13aa0 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
13ab0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13ac0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
13ad0 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a  ookieGoto==0 ){.
13ae0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
13af0 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
13b00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13b10 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
13b20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
13b30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
13b40 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
13b50 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
13b60 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
13b70 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
13b80 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b  ssert( iDb<32 );
13b90 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
13ba0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
13bb0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
13bc0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
13bd0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
13be0 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
13bf0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
13c00 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
13c10 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63   db->aDb[iDb].sc
13c20 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
13c30 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13c40 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
13c50 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
13c60 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
13c70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
13c80 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
13c90 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
13ca0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
13cb0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
13cc0 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
13cd0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
13ce0 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
13cf0 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
13d00 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
13d10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
13d20 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
13d30 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
13d40 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
13d50 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
13d60 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
13d70 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
13d80 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
13d90 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
13da0 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
13db0 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
13dc0 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
13dd0 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
13de0 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
13df0 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
13e00 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
13e10 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
13e20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
13e30 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
13e40 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
13e50 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
13e60 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
13e70 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
13e80 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
13e90 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
13ea0 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
13eb0 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
13ec0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
13ed0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
13ee0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74  ..**.** Only dat
13ef0 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68  abase iDb and th
13f00 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
13f10 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
13f20 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a  e by this call..
13f30 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68  ** If iDb==0, th
13f40 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20  en the main and 
13f50 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61  temp databases a
13f60 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
13f70 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31  .   If.** iDb==1
13f80 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74   then only the t
13f90 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20  emp database is 
13fa0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
13fb0 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68  If iDb>1 then th
13fc0 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61  e.** specified a
13fd0 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
13fe0 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  e and the temp d
13ff0 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
14000 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f   writable..*/.vo
14010 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
14020 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
14030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14040 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
14050 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
14060 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
14070 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14080 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
14090 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
140a0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
140b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72  se, iDb);.  pPar
140c0 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d  se->writeMask |=
140d0 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73   1<<iDb;.  if( s
140e0 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  etStatement ){. 
140f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14100 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d  dOp(v, OP_Statem
14110 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ent, iDb, 0);.  
14120 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  }.  if( iDb!=1 )
14130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
14140 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
14150 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74  (pParse, setStat
14160 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d  ement, 1);.  }.}
14170 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14180 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c   code that concl
14190 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f  udes an operatio
141a0 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20  n that may have 
141b0 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64  changed.** the d
141c0 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20 73  atabase.  If a s
141d0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
141e0 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
141f0 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20 61  , then emit.** a
14200 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61 74  n OP_Commit that
14210 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
14220 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63 6f  changes to be co
14230 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
14240 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
14250 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72 65   checkpoints are
14260 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
14270 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65 20  ommitted at the 
14280 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61 74  end of.** a stat
14290 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c 73  ement.  Note als
142a0 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e  o that there can
142b0 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c   be multiple cal
142c0 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
142d0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
142e0 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65  tion() but there
142f0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
14300 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c  a single.** call
14310 20 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57 72   to sqlite3EndWr
14320 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61  iteOperation() a
14330 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
14340 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
14350 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14360 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
14370 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
14380 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  e){.  /* Delete 
14390 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  me! */.  return;
143a0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72  .}../* .** Retur
143b0 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  n the transient 
143c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
143d0 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e  ject used for en
143e0 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f  coding conversio
143f0 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  ns.** during SQL
14400 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f   compilation..*/
14410 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
14420 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69  sqlite3GetTransi
14430 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 20  entValue(sqlite 
14440 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d  *db){.  if( !db-
14450 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64  >pValue ){.    d
14460 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69  b->pValue = sqli
14470 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
14480 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
14490 70 56 61 6c 75 65 3b 0a 7d 0a                    pValue;.}.