/ Hex Artifact Content
Login

Artifact d1a2d7a99bb07a1ea4a019fcef6786546cb09f73:


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 34 20 32 30 30 34 2f 30 37 2f 32 36 20 30  244 2004/07/26 0
0300: 30 3a 33 31 3a 30 39 20 64 72 68 20 45 78 70 20  0:31:09 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 20 20  eGoto);.    }.  
0a50: 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
0a60: 47 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  G.  sqlite3VdbeO
0a70: 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30  p3(v, OP_Noop, 0
0a80: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71  , 0, pParse->zSq
0a90: 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c  l, pParse->zTail
0aa0: 20 2d 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29   - pParse->zSql)
0ab0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  ;.#endif..  /* G
0ac0: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
0ad0: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
0ae0: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
0af0: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
0b00: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  nErr==0 ){.    F
0b10: 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62  ILE *trace = (db
0b20: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
0b30: 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f  _VdbeTrace)!=0 ?
0b40: 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20   stdout : 0;.   
0b50: 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 63   sqlite3VdbeTrac
0b60: 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20 20  e(v, trace);.   
0b70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
0b80: 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d  Ready(v, pParse-
0b90: 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 65  >nVar, pParse->e
0ba0: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
0bb0: 72 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65  rse->rc = pParse
0bc0: 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f  ->nErr ? SQLITE_
0bd0: 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44  ERROR : SQLITE_D
0be0: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
0bf0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
0c00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
0c10: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
0c20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73  _OK ){.    pPars
0c30: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
0c40: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
0c50: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
0c60: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
0c70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
0c80: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0c90: 6e 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  nAgg = 0;.  pPar
0ca0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
0cb0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
0cc0: 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  sk = 0;.  pParse
0cd0: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30  ->cookieGoto = 0
0ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0cf0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0d00: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d10: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
0d20: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
0d30: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
0d40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
0d50: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
0d60: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
0d70: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
0d80: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
0d90: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
0da0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
0db0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
0dc0: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
0dd0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
0de0: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74  arched for the t
0df0: 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  able and the.** 
0e00: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74  first matching t
0e10: 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  able is returned
0e20: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .  (No checking 
0e30: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
0e40: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20  ble.** names is 
0e50: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
0e60: 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50  ch order is TEMP
0e70: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
0e80: 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61  N, then any.** a
0e90: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
0ea0: 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74  es added using t
0eb0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
0ec0: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
0ed0: 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  o sqlite3LocateT
0ee0: 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65  able()..*/.Table
0ef0: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62   *sqlite3FindTab
0f00: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63  le(sqlite *db, c
0f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0f20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
0f30: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
0f40: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
0f50: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  i;.  assert( zNa
0f60: 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  me!=0 );.  asser
0f70: 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  t( (db->flags & 
0f80: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
0f90: 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ed) || db->init.
0fa0: 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d  busy );.  for(i=
0fb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
0fc0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
0fd0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
0fe0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
0ff0: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1000: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
1010: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
1020: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
1030: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
1040: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1050: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1060: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1070: 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e  b[j].tblHash, zN
1080: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1090: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
10a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
10b0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
10c0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
10d0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
10e0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
10f0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1100: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1110: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1120: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1130: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1140: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1150: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1160: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1170: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1180: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
1190: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
11a0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
11b0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
11c0: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
11d0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
11e0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
11f0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
1200: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1210: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
1220: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1230: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
1240: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
1250: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
1260: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
1270: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
1280: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
1290: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
12a0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
12b0: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
12c0: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
12d0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
12e0: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
12f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1300: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1310: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1320: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1330: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1340: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1350: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1360: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1380: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
1390: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
13a0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
13b0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
13c0: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
13d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13f0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1400: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
1410: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
1420: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
1430: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
1440: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  >db, zName, 0)!=
1450: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1460: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1470: 65 2c 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22  e, "table \"%s\"
1480: 20 69 73 20 6e 6f 74 20 69 6e 20 64 61 74 61 62   is not in datab
1490: 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ase \"%s\"",.   
14a0: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 44 62        zName, zDb
14b0: 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ase);.    }else{
14c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14e0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
14f0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1500: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1510: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
1530: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
1540: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
1550: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1560: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
1570: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
1580: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
1590: 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  hat index.** and
15a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
15b0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
15c0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
15d0: 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  x..** Return NUL
15e0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
15f0: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
1600: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
1610: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
1620: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
1630: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
1640: 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  st matching inde
1650: 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  x is returned.  
1660: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
1670: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e  for duplicate in
1680: 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  dex names is don
1690: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
16a0: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
16b0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
16c0: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
16d0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
16e0: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
16f0: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
1700: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
1710: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71  ite3FindIndex(sq
1720: 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20  lite *db, const 
1730: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
1740: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
1750: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
1760: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1770: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
1780: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
1790: 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  d) || db->init.b
17a0: 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  usy );.  for(i=0
17b0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
17c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
17d0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
17e0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
17f0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
1800: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
1810: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
1820: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
1830: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
1840: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1850: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
1860: 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e 61  [j].idxHash, zNa
1870: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  me, strlen(zName
1880: 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  )+1);.    if( p 
1890: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
18a0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
18b0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
18c0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
18d0: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
18e0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
18f0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
1900: 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66  teFree(p->zColAf
1910: 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  f);.  sqliteFree
1920: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
1930: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
1940: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
1950: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
1960: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
1970: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1980: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
1990: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
19a0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
19b0: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
19c0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
19d0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
19e0: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
19f0: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
1a00: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
1a10: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
1a20: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
1a30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
1a40: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
1a50: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20  eteIndex(sqlite 
1a60: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
1a70: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a    Index *pOld;..
1a80: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1a90: 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  && p->zName!=0 )
1aa0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  pOld = sqlit
1ab0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
1ac0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
1ad0: 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  xHash, p->zName,
1ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af0: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
1b00: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30  n(p->zName)+1, 0
1b10: 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30  );.  if( pOld!=0
1b20: 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20   && pOld!=p ){. 
1b30: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
1b40: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
1b50: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70  >iDb].idxHash, p
1b60: 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Old->zName,.    
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e   strlen(pOld->zN
1b90: 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20  ame)+1, pOld);. 
1ba0: 20 7d 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70   }.  freeIndex(p
1bb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
1bc0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  nk the given ind
1bd0: 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61 62 6c  ex from its tabl
1be0: 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65 0a 2a  e, then remove.*
1bf0: 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  * the index from
1c00: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1c10: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 69  table and free i
1c20: 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 74 72  ts memory.** str
1c30: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1c40: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
1c50: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
1c60: 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  ite *db, int iDb
1c70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
1c80: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
1c90: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20   *pIndex;.  int 
1ca0: 6c 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  len;..  len = st
1cb0: 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a  rlen(zIdxName);.
1cc0: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1cd0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
1ce0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 64 78 48 61  ->aDb[iDb].idxHa
1cf0: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65  sh, zIdxName, le
1d00: 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  n+1, 0);.  if( p
1d10: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28  Index ){.    if(
1d20: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1d30: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
1d40: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1d50: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1d60: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1d70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d80: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
1d90: 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e    for(p=pIndex->
1da0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
1db0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  p && p->pNext!=p
1dc0: 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78  Index; p=p->pNex
1dd0: 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70  t){}.      if( p
1de0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
1df0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
1e00: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
1e10: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
1e20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
1e30: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
1e40: 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c   }.  db->flags |
1e50: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
1e60: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
1e70: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
1e80: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
1e90: 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  om the in-memory
1ea0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a   hash tables of.
1eb0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  ** a single data
1ec0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
1ed0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
1ee0: 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a   reclaim memory.
1ef0: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61  ** before the da
1f00: 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20  tabase closes.  
1f10: 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65  It is also calle
1f20: 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  d during a rollb
1f30: 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ack.** if there 
1f40: 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e  were schema chan
1f50: 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74  ges during the t
1f60: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66  ransaction or if
1f70: 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f   a.** schema-coo
1f80: 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63  kie mismatch occ
1f90: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  urs..**.** If iD
1fa0: 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20  b<=0 then reset 
1fb0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
1fc0: 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61  ema tables for a
1fd0: 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
1fe0: 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32  iles.  If iDb>=2
1ff0: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
2000: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
2010: 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  for only the.** 
2020: 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69  single file indi
2030: 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cated..*/.void s
2040: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
2050: 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65  nalSchema(sqlite
2060: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
2070: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
2080: 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b  m;.  Hash temp1;
2090: 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20  .  Hash temp2;. 
20a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
20b0: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
20c0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
20d0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
20e0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
20f0: 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  d;.  for(i=iDb; 
2100: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2110: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
2120: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2130: 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c  temp1 = pDb->tbl
2140: 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20  Hash;.    temp2 
2150: 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b  = pDb->trigHash;
2160: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2170: 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48  Init(&pDb->trigH
2180: 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48  ash, SQLITE_HASH
2190: 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20  _STRING, 0);.   
21a0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
21b0: 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a  r(&pDb->aFKey);.
21c0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
21d0: 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61  lear(&pDb->idxHa
21e0: 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c  sh);.    for(pEl
21f0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
2200: 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65  st(&temp2); pEle
2210: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2220: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2230: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a  .      Trigger *
2240: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
2250: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
2260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
2270: 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54 72  eleteTrigger(pTr
2280: 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  igger);.    }.  
2290: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
22a0: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
22b0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
22c0: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53  &pDb->tblHash, S
22d0: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
22e0: 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70  G, 0);.    for(p
22f0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
2300: 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45  irst(&temp1); pE
2310: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2320: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2330: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2340: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
2350: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2360: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
2370: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
2380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2390: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65  te3HashClear(&te
23a0: 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61  mp1);.    DbClea
23b0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  rProperty(db, i,
23c0: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
23d0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30  );.    if( iDb>0
23e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
23f0: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
2400: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2410: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2420: 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49  Changes;..  /* I
2430: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
2440: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2450: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
2460: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
2470: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
2480: 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75  then from the au
2490: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
24a0: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
24b0: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
24c0: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
24d0: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
24e0: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
24f0: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
2500: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
2510: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
2520: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2530: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
2540: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
2550: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2560: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2570: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2580: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2590: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
25a0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
25b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
25c0: 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70  ( pDb->pAux && p
25d0: 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70  Db->xFreeAux ) p
25e0: 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62  Db->xFreeAux(pDb
25f0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70  ->pAux);.      p
2600: 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  Db->pAux = 0;.  
2610: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
2620: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
2630: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2640: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2650: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2660: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2670: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
2680: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
2690: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
26a0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
26b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
26c0: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
26d0: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
26e0: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
26f0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
2700: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
2710: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
2720: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
2730: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
2740: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
2750: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
2760: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
2770: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
2780: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
2790: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
27a0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
27b0: 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44  qliteFree(db->aD
27c0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
27d0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
27e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
27f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2800: 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20  lled whenever a 
2810: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
2820: 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a    If there were.
2830: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
2840: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
2850: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77  nsaction, then w
2860: 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20  e have to reset 
2870: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  the.** internal 
2880: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2890: 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d  reload them from
28a0: 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   disk..*/.void s
28b0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e  qlite3RollbackIn
28c0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
28d0: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
28e0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
28f0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
2900: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
2910: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
2920: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
2930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2940: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2950: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
2960: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
2970: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
2980: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
2990: 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  e *db){.  db->fl
29a0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
29b0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
29c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
29d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
29e0: 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  om a table or vi
29f0: 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ew..*/.static vo
2a00: 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  id sqliteResetCo
2a10: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
2a20: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
2a30: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
2a40: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
2a50: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ble!=0 );.  for(
2a60: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65  i=0, pCol=pTable
2a70: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65  ->aCol; i<pTable
2a80: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
2a90: 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  l++){.    sqlite
2aa0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Free(pCol->zName
2ab0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2ac0: 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  e(pCol->zDflt);.
2ad0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2ae0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d  Col->zType);.  }
2af0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
2b00: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  able->aCol);.  p
2b10: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
2b20: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
2b30: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
2b40: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
2b50: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2b60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b70: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
2b80: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
2b90: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
2ba0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2bb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2bc0: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
2bd0: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
2be0: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
2bf0: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
2c00: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
2c10: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
2c20: 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20  ash table.  Nor 
2c30: 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a  does it remove.*
2c40: 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66  * foreign keys f
2c50: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61  rom the sqlite.a
2c60: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e  FKey hash table.
2c70: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
2c80: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
2c90: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
2ca0: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
2cb0: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
2cc0: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
2cd0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2ce0: 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  Indices associat
2cf0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
2d00: 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66  e are unlinked f
2d10: 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20  rom the "db".** 
2d20: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
2d30: 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20  f db!=NULL.  If 
2d40: 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65  db==NULL, indice
2d50: 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a  s attached to.**
2d60: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64   the table are d
2d70: 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69  eleted, but it i
2d80: 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68  s assumed they h
2d90: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
2da0: 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f  .** unlinked..*/
2db0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
2dc0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
2dd0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
2de0: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
2df0: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
2e00: 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e  FKey *pFKey, *pN
2e10: 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20  extFKey;..  if( 
2e20: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
2e30: 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  rn;..  /* Delete
2e40: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
2e50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
2e60: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
2e70: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
2e80: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
2e90: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
2ea0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
2eb0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2ec0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
2ed0: 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69  ->iDb==pTable->i
2ee0: 44 62 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69  Db || (pTable->i
2ef0: 44 62 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  Db==0 && pIndex-
2f00: 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20  >iDb==1) );.    
2f10: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
2f20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
2f30: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
2f40: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
2f50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2f60: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
2f70: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
2f80: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
2f90: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
2fa0: 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79  om the db->aFKey
2fb0: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
2fc0: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
2fd0: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
2fe0: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
2ff0: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
3000: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
3010: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
3020: 72 74 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c  rt( pTable->iDb<
3030: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
3040: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 48 61  ssert( sqlite3Ha
3050: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b  shFind(&db->aDb[
3060: 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b  pTable->iDb].aFK
3070: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3090: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
30a0: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
30b0: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
30c0: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
30d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
30e0: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
30f0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
3100: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65   */.  sqliteRese
3110: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
3120: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ble);.  sqliteFr
3130: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
3140: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3150: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
3160: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
3170: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
3180: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
3190: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
31a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
31b0: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
31c0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
31d0: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
31e0: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
31f0: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
3200: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
3210: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3220: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3230: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
3240: 54 61 62 6c 65 28 73 71 6c 69 74 65 20 2a 64 62  Table(sqlite *db
3250: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
3260: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29   char *zTabName)
3270: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
3280: 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b  FKey *pF1, *pF2;
3290: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
32a0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
32b0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
32c0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
32d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
32e0: 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d  bName && zTabNam
32f0: 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20  e[0] );.  pDb = 
3300: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
3310: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3320: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 74 62 6c  Insert(&pDb->tbl
3330: 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Hash, zTabName, 
3340: 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29  strlen(zTabName)
3350: 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  +1, 0);.  if( p 
3360: 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70  ){.    for(pF1=p
3370: 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46  ->pFKey; pF1; pF
3380: 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d  1=pF1->pNextFrom
3390: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
33a0: 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a   = strlen(pF1->z
33b0: 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  To) + 1;.      p
33c0: 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  F2 = sqlite3Hash
33d0: 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79  Find(&pDb->aFKey
33e0: 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  , pF1->zTo, nTo)
33f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 3d  ;.      if( pF2=
3400: 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20 20  =pF1 ){.        
3410: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3420: 74 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70  t(&pDb->aFKey, p
3430: 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46  F1->zTo, nTo, pF
3440: 31 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20  1->pNextTo);.   
3450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3460: 20 20 77 68 69 6c 65 28 20 70 46 32 20 26 26 20    while( pF2 && 
3470: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46  pF2->pNextTo!=pF
3480: 31 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e  1 ){ pF2=pF2->pN
3490: 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20  extTo; }.       
34a0: 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20   if( pF2 ){.    
34b0: 20 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74        pF2->pNext
34c0: 54 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54  To = pF1->pNextT
34d0: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
34e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
34f0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
3500: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 20 20  e(db, p);.  }.  
3510: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
3520: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3530: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  s;.}../*.** Give
3540: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
3550: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
3560: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
3570: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
3580: 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71  token with any q
3590: 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65  uotations remove
35a0: 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  d.  Space to hol
35b0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
35c0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
35d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
35e0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
35f0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
3600: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
3610: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  ction..**.** Tok
3620: 65 6e 73 20 61 72 65 20 72 65 61 6c 6c 79 20 6a  ens are really j
3630: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
3640: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
3650: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
3660: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
3670: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
3680: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
3690: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
36a0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
36b0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
36c0: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
36d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
36e0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f  NameFromToken(To
36f0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
3700: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
3710: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
3720: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3730: 4e 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70  NDup(pName->z, p
3740: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
3750: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
3760: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
3770: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
3780: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
3790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
37a0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
37b0: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
37c0: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
37d0: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
37e0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
37f0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
3800: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
3810: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
3820: 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c  erTable(Vdbe *v,
3830: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
3840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3850: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
3860: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3870: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
3880: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
3890: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
38a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
38b0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
38c0: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
38d0: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
38e0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
38f0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
3900: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
3910: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
3920: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
3930: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
3940: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
3950: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
3960: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
3970: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
3980: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
3990: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
39a0: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
39b0: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
39c0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
39d0: 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28  ..*/.int findDb(
39e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
39f0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
3a00: 74 20 69 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  t i;.  Db *pDb;.
3a10: 20 20 66 6f 72 28 70 44 62 3d 64 62 2d 3e 61 44    for(pDb=db->aD
3a20: 62 2c 20 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  b, i=0; i<db->nD
3a30: 62 3b 20 69 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a  b; i++, pDb++){.
3a40: 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e      if( pName->n
3a50: 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e  ==strlen(pDb->zN
3a60: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
3a70: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
3a80: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
3a90: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
3aa0: 3e 6e 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  >n) ){.      ret
3ab0: 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn i;.    }.  }
3ac0: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
3ad0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
3ae0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
3af0: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
3b00: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
3b10: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
3b20: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
3b30: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
3b40: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
3b50: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
3b60: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
3b70: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
3b80: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
3b90: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
3ba0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
3bb0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
3bc0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
3bd0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
3be0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
3bf0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
3c00: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
3c10: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
3c20: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
3c30: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
3c40: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
3c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3c60: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
3c70: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
3c80: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
3c90: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
3ca0: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
3cb0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
3cc0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
3cd0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
3ce0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
3cf0: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
3d00: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
3d10: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
3d20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3d30: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
3d40: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
3d50: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
3d60: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
3d70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
3d80: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
3d90: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
3da0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
3db0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
3dc0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
3dd0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
3de0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
3df0: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
3e00: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
3e10: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
3e20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
3e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3e50: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
3e60: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
3e70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
3e80: 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32  b;..  if( pName2
3e90: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
3ea0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
3eb0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
3ec0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
3ed0: 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20  pName2;.    iDb 
3ee0: 3d 20 66 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  = findDb(db, pNa
3ef0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
3f00: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
3f10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3f20: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
3f30: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
3f40: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
3f50: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3f60: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
3f70: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
3f80: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
3f90: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
3fa0: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
3fb0: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
3fc0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
3fd0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
3fe0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
3ff0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4000: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
4010: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
4020: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
4030: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
4040: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
4050: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
4060: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
4070: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
4080: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
4090: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
40a0: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
40b0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
40c0: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
40d0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
40e0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
40f0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
4100: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
4110: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
4120: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
4130: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
4140: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
4150: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4170: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
4180: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
4190: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e  & 0==sqlite3StrN
41a0: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ICmp(zName, "sql
41b0: 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20  ite_", 7) ){.   
41c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
41d0: 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74  (pParse, "object
41e0: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66   name reserved f
41f0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a  or internal use:
4200: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
4210: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4220: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
4230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4240: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
4250: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
4260: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
4270: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
4280: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
4290: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
42a0: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
42b0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
42c0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
42d0: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
42e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
42f0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
4300: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4310: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
4320: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
4330: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
4340: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
4350: 61 6d 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74  ame.  The.** pSt
4360: 61 72 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  art token is the
4370: 20 43 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d   CREATE and pNam
4380: 65 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  e is the table n
4390: 61 6d 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70  ame.  The isTemp
43a0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
43b0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
43c0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
43d0: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
43e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
43f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
4400: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
4410: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
4420: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
4430: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
4440: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
4450: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
4460: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
4470: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
4480: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
4490: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
44a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
44b0: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
44c0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
44d0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
44e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
44f0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
4500: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
4510: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
4520: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
4530: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
4540: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
4550: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
4560: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
4570: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
4580: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
4590: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
45a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
45b0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
45c0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
45d0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
45e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
45f0: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
4600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4610: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4620: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  t */.  Token *pS
4630: 74 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22  tart,   /* The "
4640: 43 52 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f  CREATE" token */
4650: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4660: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
4670: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
4680: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
4690: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
46a0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
46b0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
46c0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
46d0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
46e0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
46f0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
4700: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
4710: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 20 20  /.  int isView  
4720: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4730: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
4740: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
4750: 61 62 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70  able;.  Index *p
4760: 49 64 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  Idx;.  char *zNa
4770: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  me;.  sqlite *db
4780: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
4790: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
47a0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
47b0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
47c0: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
47d0: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
47e0: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
47f0: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
4800: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
4810: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
4820: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
4830: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
4840: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4850: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4860: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
4870: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
4880: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
4890: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
48a0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
48b0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
48c0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
48d0: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
48e0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
48f0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
4900: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
4910: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
4920: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
4930: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
4940: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
4950: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
4960: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4970: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
4980: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
4990: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
49a0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
49b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
49c0: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
49d0: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
49e0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
49f0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4a00: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
4a10: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
4a20: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4a30: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
4a40: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
4a50: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
4a60: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
4a70: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
4a80: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
4a90: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
4aa0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
4ab0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
4ac0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
4ad0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
4ae0: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
4af0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4b00: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
4b10: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
4b20: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
4b30: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
4b40: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
4b50: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
4b60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4b70: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
4b80: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
4b90: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
4ba0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4bb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
4bc0: 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
4bd0: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
4be0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
4bf0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
4c00: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
4c10: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
4c20: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
4c30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4c40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
4c50: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
4c60: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
4c70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
4c80: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
4c90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
4ca0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
4cb0: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
4cc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4cd0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
4ce0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65  .  assert( (isTe
4cf0: 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20  mp & 1)==isTemp 
4d00: 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  );.  {.    int c
4d10: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ode;.    char *z
4d20: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
4d30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
4d40: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
4d50: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
4d60: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
4d70: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
4d80: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
4d90: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
4da0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
4db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4dc0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
4dd0: 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
4de0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
4df0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
4e00: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
4e10: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
4e20: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
4e30: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
4e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
4e50: 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
4e60: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
4e70: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
4e80: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
4e90: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
4ea0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
4eb0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
4ec0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
4ed0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
4ee0: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
4ef0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
4f00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4f10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
4f20: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
4f30: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
4f40: 65 20 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61  e trying to crea
4f50: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  te a temporary t
4f60: 61 62 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  able, make sure 
4f70: 74 68 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20  the Btree for.  
4f80: 2a 2a 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f  ** holding tempo
4f90: 72 61 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f  rary tables is o
4fa0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  pen..  */.  if( 
4fb0: 69 73 54 65 6d 70 20 26 26 20 64 62 2d 3e 61 44  isTemp && db->aD
4fc0: 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
4fd0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
4fe0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
4ff0: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
5000: 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
5010: 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
5020: 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
5030: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5040: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5050: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5060: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
5070: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
5080: 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
5090: 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
50a0: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
50b0: 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
50c0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
50d0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
50e0: 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
50f0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
5100: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
5110: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
5120: 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f  gs & !db->autoCo
5130: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  mmit ){.      rc
5140: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
5150: 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44  eginTrans(db->aD
5160: 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20  b[1].pBt, 1);.  
5170: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5190: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
51a0: 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
51b0: 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
51c0: 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
51d0: 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
51e0: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
51f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
5200: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
5210: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
5220: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
5230: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
5240: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5250: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
5260: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
5270: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
5280: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
5290: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
52a0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
52b0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
52c0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
52d0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
52e0: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
52f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5300: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5310: 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b  Parse) ) return;
5320: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
5330: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
5340: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
5350: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69  iDb].zName);.  i
5360: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
5370: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5380: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
5390: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
53a0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
53b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
53c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
53d0: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
53e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
53f0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
5400: 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28 20  !=0 && .      ( 
5410: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
5420: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
5430: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5440: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
5450: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
5460: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
5470: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
5480: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
5490: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
54a0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
54b0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
54c0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
54d0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  able==0 ){.    p
54e0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
54f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
5500: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5510: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
5520: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
5530: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
5540: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
5550: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
5560: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
5570: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
5580: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
5590: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
55a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20  ;.  pTable->iDb 
55b0: 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61  = iDb;.  if( pPa
55c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
55d0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
55e0: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
55f0: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
5600: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
5610: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
5620: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5630: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5640: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
5650: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
5660: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
5670: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
5680: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
5690: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
56a0: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
56b0: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
56c0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
56d0: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
56e0: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
56f0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5700: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5710: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5720: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5730: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5740: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5750: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5760: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5770: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5780: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5790: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
57a0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
57b0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
57c0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
57d0: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
57e0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
57f0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5800: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5810: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5820: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
5830: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
5840: 44 62 29 3b 0a 20 20 20 20 2f 2a 20 45 76 65 72  Db);.    /* Ever
5850: 79 20 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62  y time a new tab
5860: 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 74 68  le is created th
5870: 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20  e file-format.  
5880: 20 20 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e    ** and encodin
5890: 67 20 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72  g meta-values ar
58a0: 65 20 73 65 74 20 69 6e 20 74 68 65 20 64 61 74  e set in the dat
58b0: 61 62 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a  abase, in.    **
58c0: 20 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68   case this is th
58d0: 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72  e first table cr
58e0: 65 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eated..    */.  
58f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5900: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5910: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
5920: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
5930: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5940: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5950: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
5960: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5970: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e  _Integer, db->en
5980: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
5990: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
59a0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
59b0: 2c 20 34 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  , 4);..    sqlit
59c0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
59d0: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  e(v, iDb);.    s
59e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
59f0: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
5a00: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5a10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5a20: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
5a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a40: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
5a50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5a60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5a70: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
5a80: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
5a90: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
5aa0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
5ab0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
5ac0: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
5ad0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
5ae0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
5af0: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
5b00: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
5b10: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
5b20: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5b30: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
5b40: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
5b50: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
5b60: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
5b70: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
5b80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
5b90: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
5ba0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5bb0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
5bc0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5bd0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
5be0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5bf0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
5c00: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
5c10: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5c20: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5c30: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
5c40: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5c50: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
5c60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
5c70: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5c80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
5c90: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5ca0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
5cb0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
5cc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5cd0: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
5ce0: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
5cf0: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
5d00: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
5d10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5d20: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
5d30: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
5d40: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
5d50: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
5d60: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
5d70: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
5d80: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
5d90: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
5da0: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
5db0: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
5dc0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
5dd0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
5de0: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
5df0: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
5e00: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
5e10: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
5e20: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
5e30: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
5e40: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
5e50: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
5e60: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
5e70: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
5e80: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
5e90: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
5ea0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
5eb0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
5ec0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
5ed0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
5ee0: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
5ef0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
5f00: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
5f10: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
5f20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
5f30: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
5f40: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
5f50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5f60: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
5f70: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
5f80: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
5f90: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
5fa0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5fb0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
5fc0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
5fd0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
5fe0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
5ff0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6000: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6010: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6020: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6030: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6040: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6050: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
6060: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
6070: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6080: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
6090: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
60a0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
60b0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
60c0: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
60d0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
60e0: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
60f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6100: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
6110: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
6120: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
6130: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
6140: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6150: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
6160: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
6170: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
6180: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
6190: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
61a0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
61b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
61c0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
61d0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
61e0: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
61f0: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
6200: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
6210: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
6220: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
6230: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
6240: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
6250: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
6260: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
6270: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
6280: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
6290: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
62a0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
62b0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69  arse, Token *pFi
62c0: 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73  rst, Token *pLas
62d0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
62e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
62f0: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t n;.  char *z, 
6300: 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  **pz;.  Column *
6310: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6320: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6330: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6340: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
6350: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
6360: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
6370: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a  p->aCol[i];.  pz
6380: 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b   = &pCol->zType;
6390: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
63a0: 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29  + Addr(pLast->z)
63b0: 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e   - Addr(pFirst->
63c0: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74  z);.  sqlite3Set
63d0: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72  NString(pz, pFir
63e0: 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  st->z, n, 0);.  
63f0: 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a  z = *pz;.  if( z
6400: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6410: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b  for(i=j=0; z[i];
6420: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63   i++){.    int c
6430: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28   = z[i];.    if(
6440: 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f   isspace(c) ) co
6450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b  ntinue;.    z[j+
6460: 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b  +] = c;.  }.  z[
6470: 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e  j] = 0;.  pCol->
6480: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
6490: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
64a0: 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , n);.}../*.** T
64b0: 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69  he given token i
64c0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
64d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74  lue for the last
64e0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
64f0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75  .** the table cu
6500: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
6510: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
6520: 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74  "minusFlag" is t
6530: 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  rue, it.** means
6540: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e   the value token
6550: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
6560: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
6570: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6580: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
6590: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
65a0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
65b0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
65c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
65d0: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
65e0: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
65f0: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
6600: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
6610: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
6620: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
6630: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70  nt i;.  char **p
6640: 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  z;.  if( (p = pP
6650: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6660: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6670: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
6680: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
6690: 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43  n;.  pz = &p->aC
66a0: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69  ol[i].zDflt;.  i
66b0: 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a  f( minusFlag ){.
66c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
66d0: 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31  tring(pz, "-", 1
66e0: 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d  , pVal->z, pVal-
66f0: 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  >n, 0);.  }else{
6700: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
6710: 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d  String(pz, pVal-
6720: 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b  >z, pVal->n, 0);
6730: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
6740: 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f  quote(*pz);.}../
6750: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
6760: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
6770: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
6780: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
6790: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
67a0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
67b0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
67c0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
67d0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
67e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
67f0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
6800: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
6810: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
6820: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
6830: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
6840: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
6850: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
6860: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
6870: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
6880: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
6890: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
68a0: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
68b0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
68c0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
68d0: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
68e0: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
68f0: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
6900: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
6910: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
6920: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
6930: 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f  w id.  (Exceptio
6940: 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61  n:.** For backwa
6950: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
6960: 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74  y with older dat
6970: 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64  abases, do not d
6980: 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65  o this.** if the
6990: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72   file format ver
69a0: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c  sion number is l
69b0: 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65  ess than 1.)  Se
69c0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
69d0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
69e0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
69f0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
6a00: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
6a10: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
6a20: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
6a30: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
6a40: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
6a50: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
6a60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6a70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
6a80: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
6a90: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6aa0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
6ab0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
6ac0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
6ad0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
6ae0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
6af0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
6b00: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
6b10: 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a  imaryKey(Parse *
6b20: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
6b30: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45   *pList, int onE
6b40: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
6b50: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
6b60: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
6b70: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
6b80: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
6b90: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
6ba0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
6bb0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
6bc0: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29  ab->hasPrimKey )
6bd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6be0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
6bf0: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
6c00: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
6c10: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
6c20: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
6c30: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
6c40: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
6c50: 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b    pTab->hasPrimK
6c60: 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c  ey = 1;.  if( pL
6c70: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
6c80: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
6c90: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
6ca0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
6cb0: 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Key = 1;.  }else
6cc0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6cd0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
6ce0: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
6cf0: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
6d00: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
6d10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
6d20: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
6d30: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
6d40: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
6d50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
6d60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6d80: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
6d90: 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62  Tab->nCol ) pTab
6da0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
6db0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  rimKey = 1;.    
6dc0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
6dd0: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
6de0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
6df0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
6e00: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
6e10: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
6e20: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
6e30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
6e40: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
6e50: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
6e60: 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  GER")==0 ){.    
6e70: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
6e80: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
6e90: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
6ea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
6eb0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
6ec0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
6ed0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
6ee0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  , 0, 0);.    pLi
6ef0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
6f00: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
6f10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6f20: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
6f30: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
6f40: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
6f50: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
6f60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6f70: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
6f80: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
6f90: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
6fa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6fb0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
6fc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
6fd0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
6fe0: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62  nt nType){.  Tab
6ff0: 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a  le *p;.  Index *
7000: 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pIdx;.  CollSeq 
7010: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
7020: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
7030: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
7040: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7050: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20   = p->nCol-1;.. 
7060: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
7070: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
7080: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79  arse, zType, nTy
7090: 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69  pe);.  p->aCol[i
70a0: 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ].pColl = pColl;
70b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f  ..  /* If the co
70c0: 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64  lumn is declared
70d0: 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d   as "<name> PRIM
70e0: 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20  ARY KEY COLLATE 
70f0: 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68  <type>",.  ** th
7100: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
7110: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
7120: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
7130: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a   before the.  **
7140: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
7150: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
7160: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
7170: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a   the case..  */.
7180: 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e    for(pIdx = p->
7190: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
71a0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
71b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
71c0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
71d0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
71e0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20  iColumn[0]==i ) 
71f0: 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  pIdx->keyInfo.aC
7200: 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[0] = pColl;.
7210: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63    }.}../*.** Loc
7220: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
7230: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
7240: 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73   db.aCollSeq has
7250: 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20  h table. If the 
7260: 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69  entry.** specifi
7270: 65 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20  ed by zName and 
7280: 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75  nName is not fou
7290: 6e 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72  nd and parameter
72a0: 20 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20   'create' is.** 
72b0: 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74  true, then creat
72c0: 65 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f  e a new entry. O
72d0: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
72e0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  NULL..**.** Each
72f0: 20 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20   pointer stored 
7300: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  in the sqlite3.a
7310: 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62  CollSeq hash tab
7320: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a  le contains an.*
7330: 2a 20 61 72 72 61 79 20 6f 66 20 74 68 72 65 65  * array of three
7340: 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75   CollSeq structu
7350: 72 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 69  res. The first i
7360: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
7370: 73 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66  sequence.** pref
7380: 66 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38  ferred for UTF-8
7390: 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46  , the second UTF
73a0: 2d 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74  -16le, and the t
73b0: 68 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a  hird UTF-16be..*
73c0: 2a 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65  *.** Stored imme
73d0: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68  diately after th
73e0: 65 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f  e three collatio
73f0: 6e 20 73 65 71 75 65 6e 63 65 73 20 69 73 20 61  n sequences is a
7400: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
7410: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7420: 63 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74  ce name. A point
7430: 65 72 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e  er to this strin
7440: 67 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a  g is stored in.*
7450: 2a 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  * each collation
7460: 20 73 65 71 75 65 6e 63 65 20 73 74 72 75 63 74   sequence struct
7470: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  ure..*/.static C
7480: 6f 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c  ollSeq * findCol
7490: 6c 53 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c  lSeqEntry(.  sql
74a0: 69 74 65 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  ite *db,.  const
74b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
74c0: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
74d0: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
74e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
74f0: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61  f( nName<0 ) nNa
7500: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
7510: 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  e);.  pColl = sq
7520: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
7530: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
7540: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69  me, nName);..  i
7550: 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63  f( 0==pColl && c
7560: 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  reate ){.    pCo
7570: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
7580: 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f  c( 3*sizeof(*pCo
7590: 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20  ll) + nName + 1 
75a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
75b0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b   ){.      pColl[
75c0: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  0].zName = (char
75d0: 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20  *)&pColl[3];.   
75e0: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20     pColl[0].enc 
75f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
7600: 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e       pColl[1].zN
7610: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ame = (char*)&pC
7620: 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43  oll[3];.      pC
7630: 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c  oll[1].enc = SQL
7640: 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20  ITE_UTF16LE;.   
7650: 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d     pColl[2].zNam
7660: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7670: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7680: 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[2].enc = SQLIT
7690: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20  E_UTF16BE;.     
76a0: 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d   memcpy(pColl[0]
76b0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  .zName, zName, n
76c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
76d0: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d  ll[0].zName[nNam
76e0: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  e] = 0;.      sq
76f0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
7700: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70  &db->aCollSeq, p
7710: 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e  Coll[0].zName, n
7720: 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  Name, pColl);.  
7730: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7740: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
7750: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
7760: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46   points to a UTF
7770: 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  -8 encoded strin
7780: 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f  g nName bytes lo
7790: 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ng..** Return th
77a0: 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74  e CollSeq* point
77b0: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61  er for the colla
77c0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
77d0: 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72  med zName.** for
77e0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65   the encoding 'e
77f0: 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74  nc' from the dat
7800: 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a  abase 'db'..**.*
7810: 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73  * If the entry s
7820: 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20  pecified is not 
7830: 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74  found and 'creat
7840: 65 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  e' is true, then
7850: 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77   create a.** new
7860: 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69   entry.  Otherwi
7870: 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  se return NULL..
7880: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
7890: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a  te3FindCollSeq(.
78a0: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20    sqlite *db,.  
78b0: 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20  u8 enc,.  const 
78c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
78d0: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
78e0: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
78f0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e  Seq *pColl = fin
7900: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62  dCollSeqEntry(db
7910: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
7920: 63 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  create);.  asser
7930: 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d 3d  t( SQLITE_UTF8==
7940: 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31  1 && SQLITE_UTF1
7950: 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54 45  6LE==2 && SQLITE
7960: 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a 20  _UTF16BE==3 );. 
7970: 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53 51   assert( enc>=SQ
7980: 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e 63  LITE_UTF8 && enc
7990: 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  <=SQLITE_UTF16BE
79a0: 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20   );.  if( pColl 
79b0: 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31  ) pColl += enc-1
79c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ;.  return pColl
79d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
79e0: 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  e the 'collation
79f0: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
7a00: 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 63  k to request a c
7a10: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7a20: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
7a30: 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69  base text encodi
7a40: 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65  ng of name zName
7a50: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
7a60: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  ** If the collat
7a70: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a  ion sequence.*/.
7a80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c  static void call
7a90: 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74  CollNeeded(sqlit
7aa0: 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  e *db, const cha
7ab0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
7ac0: 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ame){.  assert( 
7ad0: 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64  !db->xCollNeeded
7ae0: 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65   || !db->xCollNe
7af0: 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20  eded16 );.  if( 
7b00: 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20  nName<0 ) nName 
7b10: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
7b20: 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c  .  if( db->xColl
7b30: 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68  Needed ){.    ch
7b40: 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20  ar *zExternal = 
7b50: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e  sqliteStrNDup(zN
7b60: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
7b70: 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20   if( !zExternal 
7b80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62  ) return;.    db
7b90: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62  ->xCollNeeded(db
7ba0: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
7bb0: 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65  , db, (int)db->e
7bc0: 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  nc, zExternal);.
7bd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7be0: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20  External);.  }. 
7bf0: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
7c00: 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68  eded16 ){.    ch
7c10: 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72  ar const *zExter
7c20: 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nal;.    sqlite3
7c30: 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73  _value *pTmp = s
7c40: 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
7c50: 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20  ntValue(db);.   
7c60: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
7c70: 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e  Str(pTmp, -1, zN
7c80: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ame, SQLITE_UTF8
7c90: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7ca0: 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20  ;.    zExternal 
7cb0: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
7cc0: 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f  xt(pTmp, SQLITE_
7cd0: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
7ce0: 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c    if( !zExternal
7cf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
7d00: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
7d10: 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64  (db->pCollNeeded
7d20: 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62  Arg, db, (int)db
7d30: 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c  ->enc, zExternal
7d40: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7d50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7d60: 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63 6f  called if the co
7d70: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
7d80: 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65 72  fails to deliver
7d90: 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20   a.** collation 
7da0: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  function in the 
7db0: 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62 75  best encoding bu
7dc0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 6f  t there may be o
7dd0: 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  ther versions.**
7de0: 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69   of this collati
7df0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72  on function (for
7e00: 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f   other text enco
7e10: 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c 65  dings) available
7e20: 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  . Use one.** of 
7e30: 74 68 65 73 65 20 69 6e 73 74 65 61 64 20 69 66  these instead if
7e40: 20 74 68 65 79 20 65 78 69 73 74 2e 20 41 76 6f   they exist. Avo
7e50: 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55  id a UTF-8 <-> U
7e60: 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e  TF-16 conversion
7e70: 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e   if.** possible.
7e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
7e90: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73  ynthCollSeq(Pars
7ea0: 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53  e *pParse, CollS
7eb0: 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f  eq *pColl){.  Co
7ec0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20  llSeq *pColl2;. 
7ed0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c   char *z = pColl
7ee0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ->zName;.  int n
7ef0: 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20   = strlen(z);.  
7f00: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
7f10: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
7f20: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
7f30: 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53   u8 aEnc[] = { S
7f40: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53  QLITE_UTF16BE, S
7f50: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 53  QLITE_UTF16LE, S
7f60: 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20  QLITE_UTF8 };.  
7f70: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b  for(i=0; i<3; i+
7f80: 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d  +){.    pColl2 =
7f90: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
7fa0: 53 65 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c  Seq(db, aEnc[i],
7fb0: 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69   z, n, 0);.    i
7fc0: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21  f( pColl2->xCmp!
7fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =0 ){.      memc
7fe0: 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32  py(pColl, pColl2
7ff0: 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  , sizeof(CollSeq
8000: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
8010: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8020: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  }.  }.  if( pPar
8030: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
8040: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
8050: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
8060: 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20  rrMsg, "no such 
8070: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8080: 63 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20  ce: ", .        
8090: 2d 31 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  -1, z, n, 0);.  
80a0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  }.  pParse->nErr
80b0: 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ++;.  return SQL
80c0: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
80d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
80e0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   is called on a 
80f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8100: 63 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ce before it is 
8110: 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b  used to.** check
8120: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 66 69   that it is defi
8130: 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65  ned. An undefine
8140: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
8150: 65 6e 63 65 20 65 78 69 73 74 73 20 77 68 65 6e  ence exists when
8160: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 69  .** a database i
8170: 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f  s loaded that co
8180: 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65  ntains reference
8190: 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  s to collation s
81a0: 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74  equences.** that
81b0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64   have not been d
81c0: 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65  efined by sqlite
81d0: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
81e0: 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20  on() etc..**.** 
81f0: 49 66 20 72 65 71 75 69 72 65 64 2c 20 74 68 69  If required, thi
8200: 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  s routine calls 
8210: 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e  the 'collation n
8220: 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20  eeded' callback 
8230: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20  to.** request a 
8240: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68  definition of th
8250: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8260: 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f  ence. If this do
8270: 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20  esn't work, .** 
8280: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  an equivalent co
8290: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
82a0: 20 74 68 61 74 20 75 73 65 73 20 61 20 74 65 78   that uses a tex
82b0: 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65  t encoding diffe
82c0: 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  rent.** from the
82d0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
82e0: 73 20 73 75 62 73 74 69 74 75 74 65 64 2c 20 69  s substituted, i
82f0: 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62  f one is availab
8300: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
8310: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50  e3CheckCollSeq(P
8320: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
8330: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
8340: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70   if( pColl && !p
8350: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
8360: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
8370: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
8380: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
8390: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
83a0: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
83b0: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
83c0: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
83d0: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
83e0: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
83f0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
8400: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
8410: 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  ->db, pColl->zNa
8420: 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c  me, strlen(pColl
8430: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69  ->zName));.    i
8440: 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  f( !pColl->xCmp 
8450: 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  && synthCollSeq(
8460: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
8470: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8480: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
8490: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
84a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
84b0: 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  .** Call sqlite3
84c0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66  CheckCollSeq() f
84d0: 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67  or all collating
84e0: 20 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e   sequences in an
84f0: 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72   index,.** in or
8500: 64 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68  der to verify th
8510: 61 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73  at all the neces
8520: 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73  sary collating s
8530: 65 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20  equences are.** 
8540: 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  loaded..*/.int s
8550: 71 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78  qlite3CheckIndex
8560: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
8570: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
8580: 64 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20  dx){.  if( pIdx 
8590: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
85a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
85b0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
85c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
85d0: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
85e0: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65  pParse, pIdx->ke
85f0: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20  yInfo.aColl[i]) 
8600: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8620: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8630: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8640: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
8660: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
8670: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
8680: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
8690: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
86a0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
86b0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
86c0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
86d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
86e0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
86f0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
8700: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
8710: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
8720: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
8730: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
8740: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8750: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
8760: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
8770: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
8780: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
8790: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
87a0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
87b0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
87c0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
87d0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
87e0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
87f0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
8800: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
8810: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
8820: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
8830: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
8840: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
8850: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
8860: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
8870: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
8880: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
8890: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
88a0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  o.** pParse..*/.
88b0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
88c0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
88d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
88e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
88f0: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38  int nName){.  u8
8900: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
8910: 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69  b->enc;.  u8 ini
8920: 74 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e  tbusy = pParse->
8930: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
8940: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
8950: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
8960: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
8970: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61   enc, zName, nNa
8980: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
8990: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
89a0: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
89b0: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
89c0: 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f    /* No collatio
89d0: 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  n sequence of th
89e0: 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  is type for this
89f0: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67   encoding is reg
8a00: 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20  istered..    ** 
8a10: 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69  Call the collati
8a20: 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65  on factory to se
8a30: 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70  e if it can supp
8a40: 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a  ly us with one..
8a50: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43      */.    callC
8a60: 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65  ollNeeded(pParse
8a70: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  ->db, zName, nNa
8a80: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  me);.    pColl =
8a90: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8aa0: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
8ab0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
8ac0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
8ad0: 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e  Coll && !pColl->
8ae0: 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  xCmp ){.      /*
8af0: 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   There may be a 
8b00: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  version of the c
8b10: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8b20: 65 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  e that requires.
8b30: 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61        ** transla
8b40: 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63  tion between enc
8b50: 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66  odings. Search f
8b60: 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e 74 68  or it with synth
8b70: 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20  CollSeq()..     
8b80: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79   */.      if( sy
8b90: 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  nthCollSeq(pPars
8ba0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, pColl) ){.   
8bb0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8bc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8bd0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e  ..  /* If nothin
8be0: 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64  g has been found
8bf0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f  , write the erro
8c00: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70  r message into p
8c10: 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21  Parse */.  if( !
8c20: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
8c30: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
8c40: 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Cmp) ){.    if( 
8c50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
8c60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8c70: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
8c80: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
8c90: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
8ca0: 73 65 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c  sequence: ", -1,
8cb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  .          zName
8cc0: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , nName, 0);.   
8cd0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e   }.    pParse->n
8ce0: 45 72 72 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c  Err++;.    pColl
8cf0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8d00: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f  rn pColl;.}..../
8d10: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8d20: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8d30: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8d40: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8d50: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8d60: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8d70: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
8d80: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
8d90: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
8da0: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74  nt nType){.  int
8db0: 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20   n, i;.  struct 
8dc0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
8dd0: 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77   *zSub;  /* Keyw
8de0: 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67 20 74  ords substring t
8df0: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
8e00: 20 20 20 20 63 68 61 72 20 6e 53 75 62 3b 20 20      char nSub;  
8e10: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
8e20: 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20   of zSub */.    
8e30: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
8e40: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
8e50: 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d  o return if it m
8e60: 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75  atches */.  } su
8e70: 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20  bstrings[] = {. 
8e80: 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53     {"INT",  3, S
8e90: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8ea0: 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c  R},.    {"CHAR",
8eb0: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
8ec0: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42  EXT},.    {"CLOB
8ed0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
8ee0: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45  _TEXT},.    {"TE
8ef0: 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  XT", 4, SQLITE_A
8f00: 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22  FF_TEXT},.    {"
8f10: 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45  BLOB", 4, SQLITE
8f20: 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b  _AFF_NONE},.  };
8f30: 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30  ..  if( nType==0
8f40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8f50: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
8f60: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
8f70: 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  <sizeof(substrin
8f80: 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74  gs)/sizeof(subst
8f90: 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  rings[0]); i++){
8fa0: 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75  .    int c1 = su
8fb0: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62  bstrings[i].zSub
8fc0: 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20  [0];.    int c2 
8fd0: 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20  = tolower(c1);. 
8fe0: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e     int limit = n
8ff0: 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67  Type - substring
9000: 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63  s[i].nSub;.    c
9010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
9020: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
9030: 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  b;.    for(n=0; 
9040: 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a  n<=limit; n++){.
9050: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54        int c = zT
9060: 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  ype[n];.      if
9070: 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63  ( (c==c1 || c==c
9080: 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2).             
9090: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
90a0: 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c  NICmp(&zType[n],
90b0: 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69   z, substrings[i
90c0: 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20  ].nSub) ){.     
90d0: 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74 72     return substr
90e0: 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79  ings[i].affinity
90f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9100: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9110: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9130: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9140: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
9150: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
9160: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
9170: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
9180: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
9190: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
91a0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
91b0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
91c0: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
91d0: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
91e0: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
91f0: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
9200: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
9210: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
9220: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
9230: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
9240: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
9250: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9260: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
9270: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
9280: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
9290: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
92a0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
92b0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
92c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
92d0: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
92e0: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
92f0: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
9300: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
9310: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
9320: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
9330: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
9340: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
9350: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
9360: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
9370: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
9380: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
9390: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
93a0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
93b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
93c0: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
93d0: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
93e0: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
93f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9400: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  3ChangeCookie(sq
9410: 6c 69 74 65 20 2a 64 62 2c 20 56 64 62 65 20 2a  lite *db, Vdbe *
9420: 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  v, int iDb){.  s
9430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9440: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
9450: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
9460: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b  ma_cookie+1, 0);
9470: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9480: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
9490: 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a  kie, iDb, 0);.}.
94a0: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
94b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
94c0: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
94d0: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
94e0: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
94f0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
9500: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9510: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
9520: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
9530: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
9540: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
9550: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
9560: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
9570: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
9580: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
9590: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
95a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
95b0: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
95c0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
95d0: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
95e0: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
95f0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
9600: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
9610: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
9620: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
9630: 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f   identifier onto
9640: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9650: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41  given string.  A
9660: 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72  dd.** quote char
9670: 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64  acters as needed
9680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9690: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
96a0: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
96b0: 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69  ar *zIdent){.  i
96c0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
96d0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
96e0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
96f0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
9700: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
9710: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
9720: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
9730: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
9740: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
9750: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
9760: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
9770: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
9780: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
9790: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
97a0: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
97b0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
97c0: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
97d0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
97e0: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
97f0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
9800: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
9810: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
9820: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
9830: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
9840: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
9850: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
9860: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
9870: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9880: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
9890: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
98a0: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
98b0: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
98c0: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
98d0: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
98e0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
98f0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
9900: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
9910: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
9920: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
9930: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
9940: 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20  tmt(Table *p){. 
9950: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
9960: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
9970: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
9980: 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20  2, *zEnd, *z;.  
9990: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
99a0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
99b0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
99c0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
99d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
99e0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
99f0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
9a00: 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70    z = pCol->zTyp
9a10: 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  e;.    if( z ){.
9a20: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
9a30: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
9a40: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
9a50: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
9a60: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
9a70: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
9a80: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
9a90: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
9aa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9ab0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
9ac0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
9ad0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
9ae0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
9af0: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
9b00: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
9b10: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
9b20: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
9b30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
9b40: 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44  cpy(zStmt, p->iD
9b50: 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54  b==1 ? "CREATE T
9b60: 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43  EMP TABLE " : "C
9b70: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
9b80: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
9b90: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
9ba0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
9bb0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
9bc0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
9bd0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
9be0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
9bf0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
9c00: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
9c10: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
9c20: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
9c30: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
9c40: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
9c50: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
9c60: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
9c70: 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e   if( (z = pCol->
9c80: 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20  zType)!=0 ){.   
9c90: 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20     zStmt[k++] = 
9ca0: 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70  ' ';.      strcp
9cb0: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b  y(&zStmt[k], z);
9cc0: 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  .      k += strl
9cd0: 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  en(z);.    }.  }
9ce0: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
9cf0: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
9d00: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
9d10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9d20: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
9d30: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
9d40: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
9d50: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
9d60: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9d70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
9d80: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9d90: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
9da0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
9db0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
9dc0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
9dd0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
9de0: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
9df0: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
9e00: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
9e10: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
9e20: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
9e30: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
9e40: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
9e50: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
9e60: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
9e70: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
9e80: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
9e90: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
9ea0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
9eb0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
9ec0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
9ed0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
9ee0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
9ef0: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
9f00: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
9f10: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
9f20: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
9f30: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
9f40: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
9f50: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
9f60: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
9f70: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
9f80: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
9f90: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
9fa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
9fb0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
9fc0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
9fd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
9fe0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
9ff0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
a000: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
a010: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
a020: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
a030: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
a040: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
a050: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
a060: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
a070: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
a080: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
a090: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
a0a0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
a0b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a0c0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
a0d0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
a0e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
a0f0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
a100: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45  ->db;..  if( (pE
a110: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
a120: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
a130: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
a140: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
a150: 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50  return;.  p = pP
a160: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a170: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
a180: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
a190: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
a1a0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
a1b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
a1c0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
a1d0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
a1e0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
a1f0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
a200: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
a210: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
a220: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
a230: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
a240: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
a250: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
a260: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
a270: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
a280: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
a290: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
a2a0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
a2b0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
a2c0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
a2d0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
a2e0: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
a2f0: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
a300: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
a310: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
a320: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
a330: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
a340: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
a350: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
a360: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
a370: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
a380: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
a390: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
a3a0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
a3b0: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
a3c0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
a3d0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
a3e0: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
a3f0: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
a400: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
a410: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
a420: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
a430: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
a440: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
a450: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
a460: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
a470: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
a480: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
a490: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
a4a0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
a4b0: 65 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73  e *v;..    v = s
a4c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
a4d0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
a4e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
a4f0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
a500: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
a510: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
a520: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a530: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a540: 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d  _CreateTable, p-
a550: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >iDb, 0);.    }e
a560: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a570: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
a580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a590: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
a5a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
a5b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a5c0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
a5d0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   0);..    /* If 
a5e0: 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
a5f0: 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
a600: 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
a610: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
a620: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
a630: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
a640: 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
a650: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
a660: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
a670: 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20  table is on the 
a680: 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20  top of the vdbe 
a690: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20  stack..    **.  
a6a0: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
a6b0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
a6c0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
a6d0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
a6e0: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
a6f0: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
a700: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
a710: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
a720: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
a730: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
a740: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
a750: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
a760: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
a770: 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tab;.      sqlit
a780: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a790: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
a7a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a7b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
a7c0: 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  er, p->iDb, 0);.
a7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a7e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
a7f0: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
a800: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
a810: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
a820: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
a830: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
a840: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
a850: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a870: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
a880: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
a890: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
a8a0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
a8b0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
a8c0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
a8d0: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
a8e0: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
a8f0: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
a900: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a910: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
a920: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
a930: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
a940: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
a950: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
a960: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
a970: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
a980: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
a990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
a9a0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
a9b0: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
a9c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
a9d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
a9e0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 2d 3e  sterTable(v, p->
a9f0: 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  iDb);..    sqlit
aa00: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
aa10: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
aa20: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61  ->pSelect==0?"ta
aa30: 62 6c 65 22 3a 22 76 69 65 77 22 2c 50 33 5f 53  ble":"view",P3_S
aa40: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
aa50: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
aa60: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
aa70: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
aa80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
aa90: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
aaa0: 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  0, 0, p->zName, 
aab0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
aac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
aad0: 75 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20 20 20  ull, 3, 0);..   
aae0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
aaf0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
ab00: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
ab10: 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20  p);.      n = z 
ab20: 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b  ? strlen(z) : 0;
ab30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ab40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
ab50: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
ab60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ab70: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a  hangeP3(v, -1, z
ab80: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
ab90: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  teFree(z);.    }
aba0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
abb0: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
abc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
abd0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
abe0: 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54  g8, 0, 0, "CREAT
abf0: 45 20 56 49 45 57 20 22 2c 20 50 33 5f 53 54 41  E VIEW ", P3_STA
ac00: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  TIC);.      }els
ac10: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ac20: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
ac30: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22  String8, 0, 0, "
ac40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 2c 20  CREATE TABLE ", 
ac50: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
ac60: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ac70: 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  ( pEnd!=0 );.   
ac80: 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64     n = Addr(pEnd
ac90: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72  ->z) - Addr(pPar
aca0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
acb0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
acc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
acd0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
ace0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
acf0: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ad00: 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61   -1, pParse->sNa
ad10: 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20  meToken.z, n);. 
ad20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ad30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63  AddOp(v, OP_Conc
ad40: 61 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  at8, 2, 0);.    
ad50: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
ad60: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
ad70: 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74  ecord, 5, 0, "tt
ad80: 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29  tit", P3_STATIC)
ad90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ada0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
adb0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
adc0: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
add0: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d  Cookie(db, v, p-
ade0: 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
adf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ae00: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
ae10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
ae20: 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
ae30: 68 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c  hema, p->iDb, 0,
ae40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ae50: 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d  MPrintf("tbl_nam
ae60: 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65  e='%q'",p->zName
ae70: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
ae80: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57  .    sqlite3EndW
ae90: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
aea0: 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  arse);.  }..  /*
aeb0: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
aec0: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
aed0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
aee0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
aef0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
af00: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
af10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
af20: 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a     Table *pOld;.
af30: 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b      FKey *pFKey;
af40: 20 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20   .    Db *pDb = 
af50: 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d  &db->aDb[p->iDb]
af60: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
af70: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
af80: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  pDb->tblHash, p-
af90: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
afa0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a  ->zName)+1, p);.
afb0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
afc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
afd0: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
afe0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
aff0: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
b000: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
b010: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
b020: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
b030: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
b040: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
b050: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
b060: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
b070: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
b080: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
b090: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
b0a0: 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b  shFind(&pDb->aFK
b0b0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
b0c0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nTo);.      sqli
b0d0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
b0e0: 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79  Db->aFKey, pFKey
b0f0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65  ->zTo, nTo, pFKe
b100: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  y);.    }.    pP
b110: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b120: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
b130: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
b140: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
b150: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
b160: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
b170: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
b180: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
b190: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
b1a0: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
b1b0: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
b1c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b1d0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
b1e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
b1f0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
b200: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
b210: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
b220: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
b230: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
b240: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
b250: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
b260: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
b270: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
b280: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
b290: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
b2a0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
b2b0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
b2c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
b2d0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
b2e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
b2f0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
b300: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
b310: 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20 20  nt isTemp       
b320: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
b330: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
b340: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
b350: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
b360: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
b370: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
b380: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
b390: 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69   *pName;..  sqli
b3a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
b3b0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
b3c0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
b3d0: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
b3e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b3f0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
b400: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
b410: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b420: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b430: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b440: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
b450: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
b460: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
b470: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
b480: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
b490: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
b4a0: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
b4b0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
b4c0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
b4d0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
b4e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b4f0: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b500: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b510: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
b520: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
b530: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
b540: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
b550: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
b560: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
b570: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
b580: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
b590: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
b5a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
b5b0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
b5c0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
b5d0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
b5e0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
b5f0: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
b600: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
b610: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
b620: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
b630: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
b640: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b650: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
b660: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
b670: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
b680: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
b690: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
b6a0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
b6b0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
b6c0: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
b6d0: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
b6e0: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
b6f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
b700: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
b710: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
b720: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
b730: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
b740: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
b750: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
b760: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
b770: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
b780: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
b790: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
b7a0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
b7b0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
b7c0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
b7d0: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
b7e0: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
b7f0: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
b800: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
b810: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
b820: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
b830: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
b840: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
b850: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
b860: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
b870: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
b880: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
b890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  .}../*.** The Ta
b8a0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
b8b0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
b8c0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
b8d0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
b8e0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
b8f0: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
b900: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
b910: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
b920: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
b930: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
b940: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
b950: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
b960: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
b970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b980: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
b990: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
b9a0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
b9b0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
b9c0: 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  List;.  Select *
b9d0: 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSel;.  Table *p
b9e0: 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45  SelTab;.  int nE
b9f0: 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rr = 0;..  asser
ba00: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
ba10: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
ba20: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
ba30: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
ba40: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
ba50: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
ba60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
ba70: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
ba80: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
ba90: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
baa0: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
bab0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
bac0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
bad0: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
bae0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
baf0: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
bb00: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
bb10: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
bb20: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
bb30: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
bb40: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
bb50: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
bb60: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
bb70: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
bb80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
bb90: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
bba0: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
bbb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
bbc0: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
bbd0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
bbe0: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
bbf0: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
bc00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
bc10: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
bc20: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
bc30: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
bc40: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
bc50: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
bc60: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
bc70: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
bc80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bc90: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
bca0: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
bcb0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
bcc0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
bcd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
bce0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
bcf0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
bd00: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
bd10: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
bd20: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
bd30: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f  le->pSelect ); /
bd40: 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68  * If nCol==0, th
bd50: 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62  en pTable must b
bd60: 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53  e a VIEW */.  pS
bd70: 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65  el = pTable->pSe
bd80: 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65  lect;..  /* Note
bd90: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
bda0: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
bdb0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
bdc0: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
bdd0: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
bde0: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
bdf0: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
be00: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
be10: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
be20: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
be30: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
be40: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
be50: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
be60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
be70: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
be80: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
be90: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
bea0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
beb0: 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73  xprListDup(pELis
bec0: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  t);.  if( pSel->
bed0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
bee0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
bef0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75  pEList;.    retu
bf00: 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 1;  /* Malloc
bf10: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
bf20: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
bf30: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
bf40: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
bf50: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
bf60: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
bf70: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
bf80: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
bf90: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
bfa0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
bfb0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
bfc0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
bfd0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
bfe0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
bff0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
c000: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
c010: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
c020: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
c030: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
c040: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
c050: 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55  Table->iDb, DB_U
c060: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20  nresetViews);.  
c070: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
c080: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
c090: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
c0a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
c0b0: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
c0c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
c0d0: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
c0e0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
c0f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75  = pEList;.  retu
c100: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
c110: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
c120: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
c130: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
c140: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
c150: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
c160: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
c170: 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69 64  lite *db, int id
c180: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
c190: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
c1a0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
c1b0: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
c1c0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
c1d0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
c1e0: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
c1f0: 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20 69  ].tblHash); i; i
c200: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
c210: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
c220: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
c230: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
c240: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
c250: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52  ){.      sqliteR
c260: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
c270: 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTab);.    }.  }
c280: 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
c290: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
c2a0: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
c2b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c2c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
c2d0: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
c2e0: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
c2f0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
c300: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
c310: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
c320: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
c330: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
c340: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
c350: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
c360: 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
c370: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
c380: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61  dbe *v;.  int ba
c390: 73 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  se;.  sqlite *db
c3a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c3b0: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
c3c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
c3d0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
c3e0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
c3f0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
c400: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
c410: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
c420: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
c430: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
c440: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
c450: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
c460: 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28  atabase);..  if(
c470: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
c480: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
c490: 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  .  iDb = pTab->i
c4a0: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
c4b0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
c4c0: 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  nDb );.#ifndef S
c4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
c4e0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
c4f0: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
c500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
c510: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
c520: 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63  Tab->iDb);.    c
c530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
c540: 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69   db->aDb[pTab->i
c550: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
c560: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
c570: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
c580: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
c590: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
c5a0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c5b0: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
c5c0: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
c5d0: 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
c5e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
c5f0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
c600: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
c610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
c620: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
c630: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
c640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c650: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
c660: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
c670: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
c680: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
c690: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
c6a0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
c6b0: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
c6c0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
c6d0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
c6e0: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
c6f0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
c700: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c710: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
c720: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
c730: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
c740: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
c750: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
c760: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
c770: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c780: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
c790: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54  .#endif.  if( pT
c7a0: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
c7b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c7c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
c7d0: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
c7e0: 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
c7f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61  >zName);.    pPa
c800: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
c810: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c820: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
c830: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
c840: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
c850: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c860: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
c870: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
c880: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
c890: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
c8a0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c8b0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
c8c0: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
c8d0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
c8e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c8f0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
c900: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
c910: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
c920: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
c930: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c940: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
c950: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
c960: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
c970: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
c980: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
c990: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
c9a0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
c9b0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
c9c0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
c9d0: 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54 61 62  beOpList dropTab
c9e0: 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  le[] = {.      {
c9f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
ca00: 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c  0, ADDR(13), 0},
ca10: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
ca20: 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20  ng8,    0, 0,   
ca30: 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f       0}, /* 1 */
ca40: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
ca50: 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
ca60: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
ca70: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
ca80: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
ca90: 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b   /* 3 */.      {
caa0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   OP_Column,     
cab0: 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 2,        0},
cac0: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
cad0: 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20 20  r.tbl_name */.  
cae0: 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20      { OP_Ne,    
caf0: 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 32 29       0, ADDR(12)
cb00: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
cb10: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20  _String8,    0, 
cb20: 30 2c 20 20 20 20 20 20 20 20 22 74 72 69 67 67  0,        "trigg
cb30: 65 72 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  er"},.      { OP
cb40: 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20  _Column,     0, 
cb50: 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a  2,        0}, /*
cb60: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74   sqlite_master.t
cb70: 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  ype */.      { O
cb80: 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c  P_Eq,         0,
cb90: 20 41 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20   ADDR(12), 0},. 
cba0: 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
cbb0: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
cbc0: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
cbd0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
cbe0: 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20   ADDR(13), 0},. 
cbf0: 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20       { OP_Goto, 
cc00: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
cc10: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ,  0},.      { O
cc20: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c  P_Next,       0,
cc30: 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f   ADDR(3),  0}, /
cc40: 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  * 12 */.    };. 
cc50: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
cc60: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
cc70: 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  igger;.    sqlit
cc80: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
cc90: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
cca0: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20   pTab->iDb);..  
ccb0: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
ccc0: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
ccd0: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
cce0: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
ccf0: 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67  Code.    ** is g
cd00: 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
cd10: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
cd20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
cd30: 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  d/or.    ** sqli
cd40: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
cd50: 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  f required..    
cd60: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
cd70: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
cd80: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
cd90: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
cda0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
cdb0: 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20  >iDb==pTab->iDb 
cdc0: 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  || pTrigger->iDb
cdd0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
cde0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
cdf0: 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
ce00: 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ger, 1);.      p
ce10: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
ce20: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
ce30: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
ce40: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
ce50: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
ce60: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
ce70: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
ce80: 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
ce90: 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
cea0: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
ceb0: 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
cec0: 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
ced0: 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
cee0: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
cef0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
cf00: 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
cf10: 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
cf20: 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
cf30: 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
cf40: 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
cf50: 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
cf60: 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
cf70: 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
cf80: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
cf90: 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
cfa0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
cfb0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
cfc0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
cfd0: 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  v, pTab->iDb);. 
cfe0: 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65     base = sqlite
cff0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  3VdbeAddOpList(v
d000: 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70  , ArraySize(drop
d010: 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c  Table), dropTabl
d020: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
d030: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62  dbeChangeP3(v, b
d040: 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  ase+1, pTab->zNa
d050: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
d060: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
d070: 64 62 2c 20 76 2c 20 70 54 61 62 2d 3e 69 44 62  db, v, pTab->iDb
d080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d090: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
d0a0: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
d0b0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
d0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d0d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
d0e0: 72 6f 79 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  roy, pTab->tnum,
d0f0: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20   pTab->iDb);.   
d100: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
d110: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d120: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d130: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d140: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d150: 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78 2d  P_Destroy, pIdx-
d160: 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62  >tnum, pIdx->iDb
d170: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d190: 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op3(v, OP_DropTa
d1a0: 62 6c 65 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20  ble, pTab->iDb, 
d1b0: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
d1c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
d1d0: 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  ndWriteOperation
d1e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
d1f0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
d200: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
d210: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
d220: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
d230: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
d240: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d250: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d260: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
d270: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
d280: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
d290: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
d2a0: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
d2b0: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
d2c0: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
d2d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
d2e0: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
d2f0: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
d300: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
d310: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
d320: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
d330: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
d340: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
d350: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
d360: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
d370: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
d380: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
d390: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
d3a0: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
d3b0: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
d3c0: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
d3d0: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
d3e0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
d3f0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
d400: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
d410: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
d420: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
d430: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
d440: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
d450: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
d460: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
d470: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
d480: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
d490: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
d4a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
d4b0: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
d4c0: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
d4d0: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
d4e0: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
d4f0: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
d500: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
d510: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
d520: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
d530: 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
d540: 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
d550: 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
d560: 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
d570: 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
d580: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
d590: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
d5a0: 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
d5b0: 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
d5c0: 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
d5d0: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
d5e0: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
d5f0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
d600: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d610: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
d620: 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
d630: 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
d640: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
d650: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
d660: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
d670: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
d680: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
d690: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d6a0: 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
d6b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
d6c0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
d6d0: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
d6e0: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
d6f0: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
d700: 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  hms. */.){.  Tab
d710: 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
d720: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
d730: 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
d740: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
d750: 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a  har *z;.  FKey *
d760: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 61 73  pFKey = 0;..  as
d770: 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
d780: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
d790: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
d7a0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
d7b0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
d7c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
d7d0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
d7e0: 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
d7f0: 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
d800: 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
d810: 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
d820: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d830: 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
d840: 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
d850: 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
d860: 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
d870: 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
d880: 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
d890: 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
d8a0: 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
d8b0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
d8c0: 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
d8d0: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
d8e0: 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
d8f0: 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
d900: 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
d910: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d920: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
d930: 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
d940: 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
d950: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
d960: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
d970: 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
d980: 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
d990: 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
d9a0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
d9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
d9c0: 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
d9d0: 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
d9e0: 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
d9f0: 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
da00: 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
da10: 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
da20: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
da30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
da40: 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
da50: 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
da60: 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
da70: 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
da80: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
da90: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
daa0: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
dab0: 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  pFKey==0 ) goto 
dac0: 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d  fk_end;.  pFKey-
dad0: 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
dae0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
daf0: 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
db00: 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
db10: 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
db20: 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
db30: 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
db40: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
db50: 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
db60: 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
db70: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
db80: 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
db90: 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
dba0: 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
dbb0: 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
dbc0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
dbd0: 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
dbe0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
dbf0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
dc00: 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
dc10: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
dc20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
dc30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
dc40: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
dc50: 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
dc60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
dc70: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
dc80: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
dc90: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
dca0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
dcb0: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
dcc0: 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
dce0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dcf0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
dd00: 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
dd10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
dd20: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
dd30: 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
dd40: 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
dd50: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
dd60: 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
dd70: 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
dd80: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
dd90: 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
dda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ddb0: 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
ddc0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
ddd0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
dde0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
ddf0: 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
de00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
de10: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
de20: 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
de30: 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
de40: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
de50: 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
de60: 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
de70: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
de80: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
de90: 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
dea0: 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20  eConf = flags & 
deb0: 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  0xff;.  pFKey->u
dec0: 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61  pdateConf = (fla
ded0: 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
dee0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72  ;.  pFKey->inser
def0: 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  tConf = (flags >
df00: 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a  > 16 ) & 0xff;..
df10: 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
df20: 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
df30: 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
df40: 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
df50: 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
df60: 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
df70: 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
df80: 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 73  Free(pFKey);.  s
df90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
dfa0: 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a  lete(pFromCol);.
dfb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
dfc0: 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b  tDelete(pToCol);
dfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
dfe0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
dff0: 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
e000: 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
e010: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
e020: 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
e030: 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
e040: 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
e050: 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
e060: 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
e070: 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
e080: 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
e090: 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
e0a0: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
e0b0: 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
e0c0: 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
e0d0: 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
e0e0: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
e0f0: 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
e100: 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
e110: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
e120: 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
e130: 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
e140: 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  red){.  Table *p
e150: 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
e160: 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
e170: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e180: 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
e190: 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
e1a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e1b0: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
e1c0: 64 20 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a  d = isDeferred;.
e1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
e1e0: 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
e1f0: 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
e200: 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d  Index is the nam
e210: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
e220: 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73  ** and pTable is
e230: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
e240: 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
e250: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
e260: 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
e270: 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
e280: 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
e290: 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
e2a0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
e2b0: 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
e2c0: 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
e2d0: 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
e2e0: 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
e2f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
e300: 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
e310: 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
e320: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
e330: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
e340: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
e350: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
e360: 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
e370: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
e380: 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
e390: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
e3a0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
e3b0: 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
e3c0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
e3d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
e3e0: 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
e3f0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
e400: 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
e410: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
e420: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
e430: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
e440: 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
e450: 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
e460: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e470: 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
e480: 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
e490: 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
e4a0: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
e4b0: 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
e4c0: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
e4d0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
e4e0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
e4f0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
e500: 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
e510: 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
e520: 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20   *pTblName,  /* 
e530: 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
e540: 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
e550: 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
e560: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
e570: 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
e580: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
e590: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
e5a0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f  nError,     /* O
e5b0: 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
e5c0: 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
e5d0: 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
e5e0: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
e5f0: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
e600: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
e610: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e620: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
e630: 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20  oken *pEnd      
e640: 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
e650: 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
e660: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
e670: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
e680: 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61  *pTab = 0; /* Ta
e690: 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
e6a0: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
e6b0: 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65  ndex = 0; /* The
e6c0: 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
e6d0: 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
e6e0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
e6f0: 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
e700: 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b  ullId;    /* Fak
e710: 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65  e token for an e
e720: 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a  mpty ID list */.
e730: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
e740: 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
e750: 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
e760: 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
e770: 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20    int isTemp;   
e780: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
e790: 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78   temporary index
e7a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
e7b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
e7c0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
e7d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
e7e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
e7f0: 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
e800: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
e810: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
e820: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
e830: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
e840: 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
e850: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
e860: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
e870: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
e880: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
e890: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
e8a0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
e8b0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
e8c0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
e8d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
e8e0: 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
e8f0: 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
e900: 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
e910: 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
e920: 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
e930: 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
e940: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
e950: 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
e960: 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
e970: 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
e980: 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
e990: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
e9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
e9b0: 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
e9c0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e9d0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
e9e0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
e9f0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
ea00: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
ea10: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ea20: 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ndex;..    /* If
ea30: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
ea40: 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
ea50: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
ea60: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
ea70: 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
ea80: 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
ea90: 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
eaa0: 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
eab0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
eac0: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
ead0: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
eae0: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
eaf0: 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
eb00: 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29  & pTab->iDb==1 )
eb10: 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b  {.      iDb = 1;
eb20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
eb30: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
eb40: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
eb50: 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
eb60: 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
eb70: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
eb80: 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
eb90: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
eba0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ebb0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
ebc0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
ebd0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
ebe0: 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
ebf0: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
ec00: 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
ec10: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
ec20: 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
ec30: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
ec40: 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
ec50: 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
ec60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
ec70: 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
ec80: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
ec90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
eca0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
ecb0: 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
ecc0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
ecd0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
ece0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
ecf0: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
ed00: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
ed10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ed20: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
ed30: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
ed40: 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
ed50: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
ed60: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ed70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
ed80: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
ed90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
eda0: 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
edb0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
edc0: 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
edd0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ede0: 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
edf0: 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
ee00: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
ee10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
ee20: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
ee30: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
ee40: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
ee50: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
ee60: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
ee70: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
ee80: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
ee90: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
eea0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
eeb0: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
eec0: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
eed0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
eee0: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
eef0: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
ef00: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
ef10: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
ef20: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
ef30: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
ef40: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
ef50: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
ef60: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
ef70: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
ef80: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
ef90: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
efa0: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
efb0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
efc0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
efd0: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
efe0: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
eff0: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
f000: 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
f010: 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
f020: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
f030: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
f040: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
f050: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
f060: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
f070: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
f080: 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
f090: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f0a0: 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
f0b0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
f0c0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f0d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f0e0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
f0f0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
f100: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
f110: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
f120: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
f130: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
f140: 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e  busy ){.      In
f150: 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
f160: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
f170: 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
f180: 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
f190: 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
f1a0: 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
f1b0: 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
f1c0: 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
f1d0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
f1e0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
f1f0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
f200: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
f210: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
f220: 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
f230: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
f240: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
f250: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
f260: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
f270: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f280: 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
f290: 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
f2a0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
f2b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f2c0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f2d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
f2e0: 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
f2f0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
f300: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
f310: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f320: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f330: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
f340: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
f350: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
f360: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
f370: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f390: 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d  else if( pName==
f3a0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
f3b0: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
f3c0: 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
f3d0: 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
f3e0: 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
f3f0: 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
f400: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
f410: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
f420: 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
f430: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
f440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
f450: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
f460: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
f470: 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
f480: 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
f490: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
f4a0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
f4b0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
f4c0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
f4d0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
f4e0: 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
f4f0: 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
f500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
f510: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
f520: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
f530: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
f540: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
f550: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f560: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f570: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
f580: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
f590: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
f5a0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
f5b0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
f5c0: 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
f5d0: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
f5e0: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
f5f0: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
f600: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
f610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
f620: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
f630: 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
f640: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
f650: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
f660: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
f670: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
f680: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
f690: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
f6a0: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
f6b0: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
f6c0: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
f6d0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
f6e0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
f6f0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
f700: 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
f710: 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
f720: 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
f730: 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
f740: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
f750: 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
f760: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
f770: 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
f780: 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
f790: 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
f7a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
f7b0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
f7c0: 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
f7d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
f7e0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
f7f0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
f800: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
f810: 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
f820: 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
f830: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
f840: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
f850: 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
f860: 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
f890: 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) + sizeof(CollS
f8a0: 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
f8b0: 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  pr );.  if( pInd
f8c0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
f8d0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f8e0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
f8f0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
f900: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
f910: 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  l[pList->nExpr];
f920: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
f930: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
f940: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
f950: 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72  t->nExpr];.  str
f960: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
f970: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
f980: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
f990: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
f9a0: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
f9b0: 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
f9c0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
f9d0: 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
f9e0: 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
f9f0: 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
fa00: 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
fa10: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
fa20: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
fa30: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
fa40: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
fa50: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
fa60: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
fa70: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
fa80: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
fa90: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
faa0: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
fab0: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
fac0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
fad0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
fae0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
faf0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
fb00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
fb10: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
fb20: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
fb30: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
fb40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fb50: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
fb60: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
fb70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fb80: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
fb90: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
fba0: 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
fbb0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
fbc0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
fbd0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
fbe0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
fbf0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
fc00: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
fc10: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
fc20: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
fc30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
fc40: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
fc50: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
fc60: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
fc70: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
fc80: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
fc90: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
fca0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
fcb0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
fcc0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
fcd0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
fce0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
fcf0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
fd00: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
fd10: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
fd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
fd30: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
fd40: 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
fd50: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
fd60: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
fd70: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
fd80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
fd90: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
fda0: 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
fdb0: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  xpr;..  if( pTab
fdc0: 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
fdd0: 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
fde0: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
fdf0: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
fe00: 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
fe10: 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
fe20: 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
fe30: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
fe40: 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
fe50: 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
fe60: 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
fe70: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
fe80: 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
fe90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
fea0: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
feb0: 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
fec0: 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
fed0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
fee0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
fef0: 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
ff00: 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
ff10: 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
ff20: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
ff30: 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
ff40: 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
ff50: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
ff60: 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
ff70: 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
ff80: 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
ff90: 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
ffa0: 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
ffb0: 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
ffc0: 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
ffd0: 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
ffe0: 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
fff0: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
10000 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
10010 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
10020 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
10030 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
10040 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10050 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
10060 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
10070 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
10080 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
10090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
100a0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
100b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
100c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
100d0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
100e0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
100f0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
10100 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
10110 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
10120 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
10130 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
10140 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
10150 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
10160 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
10170 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
10180 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
10190 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
101a0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
101b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
101c0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
101d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
101e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
101f0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
10200 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
10210 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
10220 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
10230 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
10240 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
10250 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
10260 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
10270 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
10280 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
10290 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
102a0 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
102b0 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
102c0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
102d0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
102e0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
102f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
10300 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
10310 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
10320 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
10330 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
10340 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
10350 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
10360 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
10370 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
10380 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
10390 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
103a0 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
103b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
103c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
103d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
103e0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
103f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
10400 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
10410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10420 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10440 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
10450 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
10460 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
10470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10480 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
10490 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
104a0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
104b0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
104c0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
104d0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
104e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
104f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
10500 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10520 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
10530 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
10540 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
10550 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
10560 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
10570 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
10580 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
10590 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
105a0 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
105b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
105c0 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
105d0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64  [pIndex->iDb].id
105e0 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
10610 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
10620 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
10630 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
10640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
10650 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
10660 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
10670 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ailed */.      g
10680 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10690 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
106a0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
106b0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
106c0 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
106d0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
106e0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
106f0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
10700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10710 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
10720 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
10730 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
10740 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
10750 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
10760 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
10770 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
10780 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
10790 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
107a0 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
107b0 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
107c0 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
107d0 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
107e0 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
107f0 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
10800 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
10810 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
10820 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
10830 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
10840 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
10850 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
10860 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
10870 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
10880 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
10890 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
108a0 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
108b0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
108c0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
108d0 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
108e0 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
108f0 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
10900 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
10910 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
10920 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
10930 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
10940 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
10950 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
10960 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
10970 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
10980 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
10990 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
109a0 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
109b0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
109c0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
109d0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
109e0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
109f0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
10a00 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
10a10 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69  busy==0 ){.    i
10a20 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
10a30 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
10a40 20 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20   lbl2;..    v = 
10a50 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
10a60 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
10a70 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
10a80 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10a90 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
10aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10ab0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
10ac0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
10ad0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
10ae0 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
10af0 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
10b00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
10b10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
10b20 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
10b40 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
10b50 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c  , 0, 0, "index",
10b60 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
10b70 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10b80 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
10b90 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
10ba0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
10bb0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10bc0 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
10bd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
10be0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10bf0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
10c00 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
10c10 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
10c20 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
10c30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10c40 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
10c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
10c70 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
10c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
10c90 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
10ca0 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20  te, 1, 0,.      
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10cc0 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  char*)&pIndex->k
10cd0 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
10ce0 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  FO);.    }.    s
10cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10d00 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
10d10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
10d20 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
10d30 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f        if( onErro
10d40 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r==OE_None ){.  
10d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10d60 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
10d70 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 22   "CREATE INDEX "
10d80 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10db0 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43  angeP3(v, -1, "C
10dc0 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
10dd0 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EX ", P3_STATIC)
10de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e00 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
10e10 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d  0, 0);.      n =
10e20 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
10e30 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20   Addr(pName->z) 
10e40 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
10e50 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
10e60 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  , -1, pName->z, 
10e70 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
10e80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10e90 5f 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30 29 3b  _Concat8, 2, 0);
10ea0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10eb0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
10ec0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
10ed0 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54  , "tttit", P3_ST
10ee0 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
10ef0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10f00 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
10f10 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  0);.    if( pTbl
10f20 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
10f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10f40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54  , OP_Integer, pT
10f50 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20  ab->iDb, 0);.   
10f60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10f70 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
10f80 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75  ad, 2, pTab->tnu
10f90 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64 62  m);.      /* Vdb
10fa0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
10fb0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
10fc0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
10fd0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10fe0 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
10ff0 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b   2, pTab->nCol);
11000 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71  .      lbl2 = sq
11010 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11020 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
11030 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11040 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c   OP_Rewind, 2, l
11050 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31  bl2);.      lbl1
11060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11070 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11080 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
11090 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
110a0 49 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20 20 20  Index, 2);.     
110b0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
110c0 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c  v, OP_IdxPut, 1,
110d0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
110e0 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20  !=OE_None,.     
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
11110 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
11120 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
11130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11140 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
11150 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  , 2, lbl1);.    
11160 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11170 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
11180 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
11190 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
111a0 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20  _Close, 2, 0);. 
111b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
111c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
111d0 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
111e0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
111f0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
11200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11210 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
11220 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
11230 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74    sqlite3EndWrit
11240 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
11250 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11260 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
11270 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
11280 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
11290 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d  ite3MPrintf("nam
112a0 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d  e='%q'", pIndex-
112b0 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
112c0 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
112d0 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
112e0 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
112f0 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
11300 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
11310 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
11320 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
11330 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
11340 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
11350 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
11360 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
11370 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
11380 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
11390 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
113a0 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
113b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
113c0 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
113d0 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
113e0 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
113f0 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
11400 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
11410 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
11420 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
11430 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
11440 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
11450 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
11460 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
11470 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
11480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
11490 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
114a0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
114b0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
114c0 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
114d0 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
114e0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
114f0 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
11500 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
11510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
11520 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
11530 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
11540 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
11550 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
11560 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
11570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
11580 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
11590 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
115a0 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
115b0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65  Index ){.    fre
115c0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
115d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
115e0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
115f0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
11600 4c 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e  ListDelete(pTblN
11610 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
11620 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
11630 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
11640 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11650 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
11660 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
11670 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
11680 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
11690 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
116a0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
116b0 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
116c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
116d0 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49  ist *pName){.  I
116e0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
116f0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
11700 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
11710 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
11720 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
11730 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
11740 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
11750 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
11760 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
11770 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
11780 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
11790 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49  ) ) return;.  pI
117a0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
117b0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
117c0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
117d0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
117e0 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
117f0 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
11800 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11810 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
11820 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
11830 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
11840 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
11850 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
11860 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
11870 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
11880 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
11890 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
118a0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
118b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
118c0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
118d0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
118e0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
118f0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
11900 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
11910 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
11920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11930 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11940 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
11950 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
11960 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
11970 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
11980 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
11990 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
119a0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
119b0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
119c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
119d0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
119e0 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
119f0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11a00 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11a10 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
11a20 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
11a30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
11a40 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
11a50 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
11a60 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
11a70 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
11a80 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
11a90 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
11aa0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
11ab0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
11ac0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
11ad0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11ae0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
11af0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
11b00 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11b10 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
11b20 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
11b30 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
11b40 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
11b50 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11b60 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
11b70 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74  tatic VdbeOpList
11b80 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
11b90 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
11ba0 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
11bb0 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
11bc0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
11bd0 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
11be0 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
11bf0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
11c00 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
11c10 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
11c20 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
11c30 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
11c40 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
11c50 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
11c60 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11c70 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
11c80 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
11c90 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
11ca0 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
11cb0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
11cc0 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
11cd0 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
11ce0 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
11cf0 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
11d00 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
11d10 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20      int base;.. 
11d20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
11d30 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
11d40 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d  arse, 0, pIndex-
11d50 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
11d60 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
11d70 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  e(v, pIndex->iDb
11d80 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  );.    base = sq
11d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
11da0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
11db0 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70  dropIndex), drop
11dc0 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
11dd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
11de0 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65  v, base+1, pInde
11df0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
11e00 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
11e10 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e  ookie(db, v, pIn
11e20 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73  dex->iDb);.    s
11e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11e40 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
11e50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11e60 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
11e70 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e  estroy, pIndex->
11e80 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
11e90 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
11ea0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
11eb0 70 49 6e 64 65 78 2c 20 70 49 6e 64 65 78 2d 3e  pIndex, pIndex->
11ec0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
11ed0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
11ee0 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
11ef0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
11f00 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
11f10 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
11f20 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
11f30 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ame);.}../*.** A
11f40 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
11f50 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
11f60 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
11f70 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
11f80 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
11f90 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
11fa0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
11fb0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
11fc0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
11fd0 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
11fe0 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
11ff0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
12000 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
12010 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
12020 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
12030 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
12040 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
12050 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
12060 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
12070 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
12080 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c  ( pList->nId>=pL
12090 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
120a0 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
120b0 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c  _item *a;.    pL
120c0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
120d0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
120e0 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  5;.    a = sqlit
120f0 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
12100 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  a, pList->nAlloc
12110 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
12120 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
12130 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
12140 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
12150 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
12160 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
12170 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
12180 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
12190 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
121a0 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
121b0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
121c0 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
121d0 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >nId].zName = sq
121e0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
121f0 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c  en(pToken);.  pL
12200 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
12210 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
12220 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
12230 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
12240 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
12250 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
12260 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
12270 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
12280 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
12290 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
122a0 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
122b0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
122c0 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
122d0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
122e0 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
122f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
12300 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
12310 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
12320 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
12330 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
12340 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
12350 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
12360 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
12370 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
12380 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
12390 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
123a0 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
123b0 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
123c0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
123d0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
123e0 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
123f0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
12400 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
12410 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
12420 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
12430 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
12440 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
12450 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
12460 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
12470 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
12480 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
12490 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
124a0 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
124b0 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
124c0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
124d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
124e0 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
124f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
12500 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12510 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,0);.**.**
12520 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
12530 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
12540 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
12550 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
12560 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
12570 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
12580 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
12590 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
125a0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
125b0 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
125c0 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
125d0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
125e0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
125f0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
12600 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
12610 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
12620 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
12630 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
12640 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
12650 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
12660 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
12670 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
12680 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
12690 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
126a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
126b0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
126c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
126d0 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
126e0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
126f0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
12700 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
12710 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
12720 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
12730 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
12740 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
12750 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
12760 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
12770 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
12780 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
12790 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
127a0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
127b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
127c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
127d0 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
127e0 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
127f0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
12800 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
12810 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
12820 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
12830 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
12840 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
12850 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
12860 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
12870 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
12880 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
12890 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
128a0 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
128b0 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
128c0 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
128d0 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
128e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
128f0 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b  omToken(pTable);
12900 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
12910 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
12920 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61  eFromToken(pData
12930 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  base);.  pItem->
12940 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
12950 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
12960 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
12970 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
12980 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
12990 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
129a0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
129b0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
129c0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
129d0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
129e0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
129f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
12a00 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
12a10 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
12a20 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a  i].iCursor<0 ){.
12a30 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
12a40 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ].iCursor = pPar
12a50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12a60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
12a70 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74  dd an alias to t
12a80 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69  he last identifi
12a90 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  er on the given 
12aa0 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e  identifier list.
12ab0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12ac0 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28  SrcListAddAlias(
12ad0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
12ae0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
12af0 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
12b00 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  List->nSrc>0 ){.
12b10 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
12b20 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69  st->nSrc-1].zAli
12b30 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
12b40 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
12b50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12b60 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
12b70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12b80 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
12b90 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
12ba0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
12bb0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
12bc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
12bd0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
12be0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
12bf0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
12c00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
12c10 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
12c20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
12c30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
12c40 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
12c50 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
12c60 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
12c70 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
12c80 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
12c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
12ca0 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
12cb0 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
12cc0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
12cd0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
12ce0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
12cf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
12d00 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
12d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
12d20 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
12d30 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
12d40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
12d50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
12d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
12d70 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
12d80 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
12d90 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
12da0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12db0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
12dc0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
12dd0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
12de0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12df0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
12e00 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
12e10 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
12e20 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
12e30 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
12e40 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
12e50 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
12e60 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
12e70 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
12e80 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
12e90 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
12ea0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
12eb0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20   pItem->pTab && 
12ec0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54  pItem->pTab->isT
12ed0 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20  ransient ){.    
12ee0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
12ef0 61 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70  able(0, pItem->p
12f00 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
12f10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
12f20 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ete(pItem->pSele
12f30 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
12f40 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d  ExprDelete(pItem
12f50 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
12f60 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
12f70 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
12f80 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
12f90 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
12fa0 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
12fb0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
12fc0 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
12fd0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
12fe0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  rse){.  sqlite *
12ff0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
13000 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
13010 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
13020 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
13030 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
13040 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
13050 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
13060 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
13070 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
13080 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13090 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
130a0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
130b0 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
130c0 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
130d0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
130e0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
130f0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
13100 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13110 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
13120 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
13130 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
13140 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
13150 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
13160 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
13170 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  e){.  sqlite *db
13180 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
13190 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
131a0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
131b0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
131c0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
131d0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
131e0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
131f0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
13200 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
13210 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13220 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
13230 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
13240 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65  MIT", 0, 0) ) re
13250 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
13260 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13270 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
13280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13290 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
132a0 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
132b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
132c0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
132d0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
132e0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
132f0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
13300 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  se){.  sqlite *d
13310 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
13320 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
13330 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
13340 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
13350 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
13360 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
13370 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
13380 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
13390 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
133a0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
133b0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
133c0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
133d0 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
133e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
133f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13400 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
13410 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13420 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
13430 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
13440 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
13450 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
13460 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
13470 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
13480 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
13490 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
134a0 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
134b0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
134c0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
134d0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
134e0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
134f0 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
13500 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
13510 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
13520 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
13530 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
13540 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
13550 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
13560 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
13570 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
13580 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
13590 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
135a0 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
135b0 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
135c0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
135d0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
135e0 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
135f0 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68  de an OP_Goto th
13600 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
13610 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
13620 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
13630 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
13640 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
13650 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
13660 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
13670 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
13680 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
13690 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
136a0 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
136b0 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
136c0 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
136d0 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
136e0 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
136f0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
13700 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
13710 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
13720 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
13730 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
13740 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  to P2 value.** w
13750 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
13760 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
13770 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
13780 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
13790 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
137a0 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
137b0 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
137c0 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
137d0 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  oding()..**.** I
137e0 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64  f iDb<0 then cod
137f0 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e  e the OP_Goto on
13800 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66  ly - don't set f
13810 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  lag to verify th
13820 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61  e.** schema on a
13830 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54  ny databases.  T
13840 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
13850 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  to position the 
13860 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79  OP_Goto.** early
13870 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65   in the code, be
13880 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20  fore we know if 
13890 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62  any database tab
138a0 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  les will be used
138b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
138c0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
138d0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
138e0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
138f0 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
13900 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  *v;.  int mask;.
13910 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13920 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13930 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
13940 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
13950 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
13960 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
13970 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70  rror */.  db = p
13980 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
13990 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
139a0 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  oto==0 ){.    pP
139b0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
139c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
139d0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
139e0 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
139f0 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
13a00 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
13a10 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
13a20 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
13a30 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
13a40 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
13a50 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d   iDb<32 );.    m
13a60 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
13a70 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
13a80 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
13a90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
13aa0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
13ab0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
13ac0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
13ad0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
13ae0 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
13af0 6f 6f 6b 69 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  ookie;.    }.  }
13b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
13b10 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
13b20 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
13b30 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
13b40 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
13b50 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
13b60 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
13b70 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
13b80 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
13b90 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
13ba0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
13bb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
13bc0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
13bd0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
13be0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
13bf0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
13c00 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
13c10 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
13c20 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
13c30 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
13c40 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
13c50 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
13c60 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
13c70 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
13c80 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
13c90 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
13ca0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
13cb0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
13cc0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
13cd0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
13ce0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
13cf0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
13d00 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
13d10 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
13d20 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
13d30 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
13d40 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
13d50 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
13d60 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
13d70 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
13d80 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
13d90 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
13da0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
13db0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
13dc0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
13dd0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
13de0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
13df0 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
13e00 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
13e10 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
13e20 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
13e30 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
13e40 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
13e50 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
13e60 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
13e70 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
13e80 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
13e90 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
13ea0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
13eb0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
13ec0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
13ed0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
13ee0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13ef0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
13f00 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
13f10 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
13f20 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
13f30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13f40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
13f50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
13f60 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13f70 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
13f80 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
13f90 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
13fa0 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
13fb0 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
13fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13fd0 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69   OP_Statement, i
13fe0 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  Db, 0);.  }.  if
13ff0 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
14000 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
14010 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
14020 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  e, setStatement,
14030 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
14040 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14050 74 68 61 74 20 63 6f 6e 63 6c 75 64 65 73 20 61  that concludes a
14060 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
14070 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
14080 64 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  d.** the databas
14090 65 2e 20 20 49 66 20 61 20 73 74 61 74 65 6d 65  e.  If a stateme
140a0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
140b0 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
140c0 20 65 6d 69 74 0a 2a 2a 20 61 6e 20 4f 50 5f 43   emit.** an OP_C
140d0 6f 6d 6d 69 74 20 74 68 61 74 20 77 69 6c 6c 20  ommit that will 
140e0 63 61 75 73 65 20 74 68 65 20 63 68 61 6e 67 65  cause the change
140f0 73 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65  s to be committe
14100 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
14110 20 4e 6f 74 65 20 74 68 61 74 20 63 68 65 63 6b   Note that check
14120 70 6f 69 6e 74 73 20 61 72 65 20 61 75 74 6f 6d  points are autom
14130 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 74  atically committ
14140 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
14150 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  .** a statement.
14160 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
14170 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75   there can be mu
14180 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20  ltiple calls to 
14190 0a 2a 2a 20 73 71 6c 69 74 65 33 42 65 67 69 6e  .** sqlite3Begin
141a0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29  WriteOperation()
141b0 20 62 75 74 20 74 68 65 72 65 20 73 68 6f 75 6c   but there shoul
141c0 64 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  d only be a sing
141d0 6c 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  le.** call to sq
141e0 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
141f0 72 61 74 69 6f 6e 28 29 20 61 74 20 74 68 65 20  ration() at the 
14200 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
14210 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  e statement..*/.
14220 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 57  void sqlite3EndW
14230 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
14240 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14250 2f 2a 20 44 65 6c 65 74 65 20 6d 65 21 20 2a 2f  /* Delete me! */
14260 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
14270 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20   .** Return the 
14280 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69 74 65  transient sqlite
14290 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 75  3_value object u
142a0 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67  sed for encoding
142b0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20   conversions.** 
142c0 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69  during SQL compi
142d0 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  lation..*/.sqlit
142e0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
142f0 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
14300 75 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  ue(sqlite *db){.
14310 20 20 69 66 28 20 21 64 62 2d 3e 70 56 61 6c 75    if( !db->pValu
14320 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61  e ){.    db->pVa
14330 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  lue = sqlite3Val
14340 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72  ueNew();.  }.  r
14350 65 74 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65  eturn db->pValue
14360 3b 0a 7d 0a                                      ;.}.