/ Hex Artifact Content
Login

Artifact a25bf9d25623c7730bc58922e0e84204ad98c968:


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 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 33 34 20 32 30 30 37 2f 30 38 2f 31 36  1.434 2007/08/16
02f0: 20 30 34 3a 33 30 3a 33 39 20 64 72 68 20 45 78   04:30:39 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  k *p;..  if( 0==
08e0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
08f0: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
0900: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 69 44  SharedData || iD
0910: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
0920: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0930: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0940: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0950: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0960: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0970: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0980: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
09a0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
09b0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
09c0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
09d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09e0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09f0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
0a00: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
0a10: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
0a20: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
0a30: 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c  ock = .      sql
0a40: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
0a50: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
0a60: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a70: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a80: 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  f( pParse->aTabl
0a90: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d  eLock ){.    p =
0aa0: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0ab0: 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61  Lock[pParse->nTa
0ac0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0ad0: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0ae0: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0af0: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0b00: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0b10: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ck;.    p->zName
0b20: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a   = zName;.  }.}.
0b30: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0b40: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0b50: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0b60: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0b70: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b80: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b90: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0ba0: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0bb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0bc0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0bd0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0be0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0bf0: 64 62 65 3b 20 0a 20 20 61 73 73 65 72 74 28 20  dbe; .  assert( 
0c00: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
0c10: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
0c20: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 70 50  SharedData || pP
0c30: 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  arse->nTableLock
0c40: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 30 3d  ==0 );..  if( 0=
0c50: 3d 28 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  =(pVdbe = sqlite
0c60: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
0c70: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
0c80: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  .  }..  for(i=0;
0c90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ca0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0cb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0cc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0cd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0ce0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0cf0: 20 69 66 28 20 70 2d 3e 69 73 57 72 69 74 65 4c   if( p->isWriteL
0d00: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 31 20  ock ){.      p1 
0d10: 3d 20 2d 31 2a 28 70 31 2b 31 29 3b 0a 20 20 20  = -1*(p1+1);.   
0d20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
0d30: 62 65 4f 70 33 28 70 56 64 62 65 2c 20 4f 50 5f  beOp3(pVdbe, OP_
0d40: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0d50: 2d 3e 69 54 61 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ->iTab, p->zName
0d60: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
0d70: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
0d80: 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  ine codeTableLoc
0d90: 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ks(x).#endif../*
0da0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0db0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
0dc0: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74   a single SQL st
0dd0: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0de0: 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61  .** parsed and a
0df0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f   VDBE program to
0e00: 20 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74   execute that st
0e10: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0e20: 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54  .** prepared.  T
0e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73  his routine puts
0e40: 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74   the finishing t
0e50: 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a  ouches on the.**
0e60: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e   VDBE program an
0e70: 64 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61  d resets the pPa
0e80: 72 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  rse structure fo
0e90: 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61  r the next.** pa
0ea0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  rse..**.** Note 
0eb0: 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72  that if an error
0ec0: 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69   occurred, it mi
0ed0: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
0ee0: 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20  that.** no VDBE 
0ef0: 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74  code was generat
0f00: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
0f10: 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
0f20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
0f30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
0f40: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 64 62 20   Vdbe *v;..  db 
0f50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0f60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0f70: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
0f80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
0f90: 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ted ) return;.  
0fa0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 56 64  if( !pParse->pVd
0fb0: 62 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  be ){.    if( pP
0fc0: 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  arse->rc==SQLITE
0fd0: 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  _OK && pParse->n
0fe0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Err ){.      pPa
0ff0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1000: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 72 65  _ERROR;.      re
1010: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
1020: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1030: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1040: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
1050: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1060: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
1070: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
1080: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1090: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
10a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c  eAddOp(v, OP_Hal
10c0: 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  t, 0, 0);..    /
10d0: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
10e0: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
10f0: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
1100: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
1110: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
1120: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
1130: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
1140: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
1150: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
1160: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1170: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
1180: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
1190: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
11a0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
11b0: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
11c0: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
11d0: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
11e0: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
11f0: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
1200: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1210: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
1220: 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20  Goto>0 ){.      
1230: 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  u32 mask;.      
1240: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73  int iDb;.      s
1250: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1260: 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f  re(v, pParse->co
1270: 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20  okieGoto-1);.   
1280: 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61     for(iDb=0, ma
1290: 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  sk=1; iDb<db->nD
12a0: 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62  b; mask<<=1, iDb
12b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
12c0: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
12d0: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20  >cookieMask)==0 
12e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1300: 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73  ddOp(v, OP_Trans
1310: 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61  action, iDb, (ma
1320: 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69  sk & pParse->wri
1330: 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20  teMask)!=0);.   
1340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1350: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
1360: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70  fyCookie, iDb, p
1370: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1380: 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20  ue[iDb]);.      
1390: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13b0: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  LE.      if( pPa
13c0: 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63  rse->pVirtualLoc
13d0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  k ){.        cha
13e0: 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20  r *vtab = (char 
13f0: 2a 29 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75  *)pParse->pVirtu
1400: 61 6c 4c 6f 63 6b 2d 3e 70 56 74 61 62 3b 0a 20  alLock->pVtab;. 
1410: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1420: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 42 65 67  beOp3(v, OP_VBeg
1430: 69 6e 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20  in, 0, 0, vtab, 
1440: 50 33 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20  P3_VTAB);.      
1450: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1460: 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20  /* Once all the 
1470: 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65  cookies have bee
1480: 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74  n verified and t
1490: 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
14a0: 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62  ed, .      ** ob
14b0: 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65  tain the require
14c0: 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54  d table-locks. T
14d0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  his is a no-op u
14e0: 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20  nless the .     
14f0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
1500: 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62   feature is enab
1510: 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
1520: 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63      codeTableLoc
1530: 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ks(pParse);.    
1540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1550: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
1560: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
1570: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  Goto);.    }..#i
1580: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1590: 54 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41  T_TRACE.    /* A
15a0: 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20  dd a No-op that 
15b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
15c0: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
15d0: 65 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20  e compiled SQL. 
15e0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
15f0: 61 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65  as its P3 argume
1600: 6e 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e  nt.  This does n
1610: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75  ot change the fu
1620: 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20  nctionality.    
1630: 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ** of the progra
1640: 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m. .    **.    *
1650: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
1660: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  o implement sqli
1670: 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20  te3_trace()..   
1680: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1690: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f  dbeOp3(v, OP_Noo
16a0: 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d  p, 0, 0, pParse-
16b0: 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a  >zSql, pParse->z
16c0: 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71  Tail-pParse->zSq
16d0: 6c 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  l);.#endif /* SQ
16e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
16f0: 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65  */.  }...  /* Ge
1700: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
1710: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
1720: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
1730: 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ( v && pParse->n
1740: 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d  Err==0 && !db->m
1750: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23  allocFailed ){.#
1760: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1770: 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  UG.    FILE *tra
1780: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
1790: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
17a0: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
17b0: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
17c0: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
17d0: 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ce);.#endif.    
17e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
17f0: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
1800: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
1810: 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20  em+3,.          
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1830: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70  Parse->nTab+3, p
1840: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b  Parse->explain);
1850: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1860: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1870: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
1880: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1890: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
18a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
18c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
18d0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
18e0: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
18f0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
1900: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
1910: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
1920: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1930: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
1940: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1950: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
1960: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1970: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1980: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1990: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
19a0: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
19b0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
19c0: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
19d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
19e0: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
19f0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1a00: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1a10: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1a20: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1a30: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1a40: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1a50: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1a60: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1a70: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1a80: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1a90: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1aa0: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1ab0: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1ac0: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1ad0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1ae0: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1af0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1b00: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1b10: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1b20: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
1b30: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
1b40: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1b50: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1b60: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1b70: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1b80: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1b90: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1ba0: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1bb0: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1bc0: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1bd0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1be0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1bf0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1c00: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65  char *zSql;.# de
1c10: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
1c20: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
1c30: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
1c40: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
1c50: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
1c60: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1c70: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
1c80: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
1c90: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
1ca0: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
1cb0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
1cc0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
1cd0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1ce0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
1cf0: 74 65 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72  te3VMPrintf(zFor
1d00: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1d10: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53  nd(ap);.  if( zS
1d20: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ql==0 ){.    pPa
1d30: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1d40: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
1d50: 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61  eturn;   /* A ma
1d60: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1d70: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
1d80: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b  Parse->nested++;
1d90: 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75  .  memcpy(saveBu
1da0: 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  f, &pParse->nVar
1db0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65  , SAVE_SZ);.  me
1dc0: 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56  mset(&pParse->nV
1dd0: 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b  ar, 0, SAVE_SZ);
1de0: 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72  .  sqlite3RunPar
1df0: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
1e00: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1e10: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65  free(zSql);.  me
1e20: 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56  mcpy(&pParse->nV
1e30: 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56  ar, saveBuf, SAV
1e40: 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d  E_SZ);.  pParse-
1e50: 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a  >nested--;.}../*
1e60: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1e70: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1e80: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1e90: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
1ea0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
1eb0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1ec0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
1ed0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
1ee0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1ef0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
1f00: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
1f10: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1f20: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1f30: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1f40: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1f50: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1f60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
1f70: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
1f80: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
1f90: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1fa0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
1fb0: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
1fc0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1fd0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1fe0: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
1ff0: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
2000: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
2010: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2020: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
2030: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
2040: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
2050: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
2060: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2070: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
2080: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2090: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
20a0: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
20b0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
20c0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
20d0: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
20e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
20f0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
2100: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
2110: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
2120: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
2130: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
2140: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
2150: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
2160: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
2170: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
2180: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
2190: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
21a0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
21b0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
21c0: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
21d0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
21e0: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
21f0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2200: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2210: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2220: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2230: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2240: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2250: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2260: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2270: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2280: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2290: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
22a0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
22b0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
22c0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
22d0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
22e0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
22f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2300: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2310: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2320: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2330: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2340: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2350: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2360: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2370: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2380: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2390: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
23a0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
23b0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
23c0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
23d0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
23e0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
23f0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2400: 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62   *zDbase){.  Tab
2410: 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61  le *p;..  /* Rea
2420: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2430: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
2440: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
2450: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2460: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
2470: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
2480: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
2490: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
24a0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
24b0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
24c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
24d0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
24e0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
24f0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2500: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2510: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
2520: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2530: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2540: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
2550: 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20  %s.%s", zDbase, 
2560: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
2570: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2580: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2590: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
25a0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
25b0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
25c0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
25d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
25e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
25f0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2600: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2610: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
2620: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
2630: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2640: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
2650: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
2660: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
2670: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
2680: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
2690: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
26a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
26b0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
26c0: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
26d0: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
26e0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
26f0: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e  irst matching in
2700: 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dex is returned.
2710: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
2720: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
2730: 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64  index names is d
2740: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
2750: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
2760: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2770: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
2780: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2790: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
27a0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
27b0: 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  and..*/.Index *s
27c0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
27d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
27e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
27f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
2800: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30  {.  Index *p = 0
2810: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
2820: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2830: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2840: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2850: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
2860: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2870: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2880: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2890: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
28a0: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a  chema;.    if( z
28b0: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
28c0: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
28d0: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
28e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
28f0: 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28  rt( pSchema || (
2900: 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62  j==1 && !db->aDb
2910: 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20  [1].pBt) );.    
2920: 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20  if( pSchema ){. 
2930: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
2940: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
2950: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
2960: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
2970: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +1);.    }.    i
2980: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
2990: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
29a0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
29b0: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
29c0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
29d0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
29e0: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
29f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
2a00: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
2a10: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
2a20: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
2a30: 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72  e given index fr
2a40: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
2a50: 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65  h table, and fre
2a60: 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20  e.** its memory 
2a70: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
2a80: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72  * The index is r
2a90: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2aa0: 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61  database hash ta
2ab0: 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69  bles but.** it i
2ac0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66  s not unlinked f
2ad0: 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68  rom the Table th
2ae0: 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a  at it indexes..*
2af0: 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d  * Unlinking from
2b00: 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20   the Table must 
2b10: 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63  be done by the c
2b20: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
2b30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b40: 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65  sqliteDeleteInde
2b50: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  x(Index *p){.  I
2b60: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f  ndex *pOld;.  co
2b70: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2b80: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70  = p->zName;..  p
2b90: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
2ba0: 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
2bb0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2bc0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61  ame, strlen( zNa
2bd0: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73  me)+1, 0);.  ass
2be0: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2bf0: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65  pOld==p );.  fre
2c00: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2c10: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
2c20: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
2c30: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
2c40: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2c50: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
2c60: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
2c70: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
2c80: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
2c90: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
2ca0: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
2cb0: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
2cc0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2cd0: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2ce0: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
2cf0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2d00: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2d10: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2d20: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
2d30: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
2d40: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2d50: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
2d60: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
2d70: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
2d80: 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20  xHash;..  len = 
2d90: 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29  strlen(zIdxName)
2da0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
2db0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
2dc0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
2dd0: 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  len+1, 0);.  if(
2de0: 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69   pIndex ){.    i
2df0: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
2e00: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
2e10: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
2e20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
2e30: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
2e40: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
2e50: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
2e60: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
2e70: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2e80: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
2e90: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
2ea0: 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  ext){}.      if(
2eb0: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d   p && p->pNext==
2ec0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
2ed0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
2ee0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
2f00: 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
2f10: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
2f20: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
2f30: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
2f40: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
2f50: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
2f60: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
2f70: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
2f80: 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61  f.** a single da
2f90: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
2fa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2fb0: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
2fc0: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
2fd0: 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e  database closes.
2fe0: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
2ff0: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
3000: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
3010: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
3020: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
3030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
3040: 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63  if a.** schema-c
3050: 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f  ookie mismatch o
3060: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
3070: 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65  iDb<=0 then rese
3080: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3090: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72  chema tables for
30a0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
30b0: 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e   files.  If iDb>
30c0: 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =2 then reset th
30d0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
30e0: 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a  a for only the.*
30f0: 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e  * single file in
3100: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dicated..*/.void
3110: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
3120: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
3130: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3140: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  ){.  int i, j;..
3150: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
3160: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
3170: 29 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20  );.  for(i=iDb; 
3180: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3190: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
31a0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
31b0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
31c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
31d0: 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d  3SchemaFree(pDb-
31e0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
31f0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
3200: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3210: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
3220: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
3230: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
3240: 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  anges;..  /* If 
3250: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
3260: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
3270: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
3280: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
3290: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
32a0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  em from the auxi
32b0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
32c0: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
32d0: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
32e0: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
32f0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
3300: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
3310: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
3320: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
3330: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
3340: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
3350: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
3360: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
3370: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
3380: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
3390: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
33a0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
33b0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
33c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
33d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
33e0: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
33f0: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
3400: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
3410: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
3420: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
3430: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
3440: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
3450: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3460: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3470: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3480: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
3490: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34a0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
34b0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
34c0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
34d0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
34e0: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
34f0: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3500: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3510: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3520: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3530: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3540: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3550: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
3560: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
3570: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
3580: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
3590: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
35a0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
35b0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
35c0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
35d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
35e0: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
35f0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
3600: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
3610: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3620: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
3630: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
3640: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
3650: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
3660: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
3670: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3680: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3690: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nges;.}../*.** C
36a0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
36b0: 6e 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62  names from a tab
36c0: 6c 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73  le or view..*/.s
36d0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
36e0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
36f0: 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  s(Table *pTable)
3700: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
3710: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
3720: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
3730: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
3740: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
3750: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3760: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
3770: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
3780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3790: 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  e(pCol->zName);.
37a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
37b0: 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44  rDelete(pCol->pD
37c0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
37d0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
37e0: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
37f0: 69 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e  ite3_free(pCol->
3800: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
3810: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3820: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
3830: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  }.  pTable->aCol
3840: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3850: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
3860: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
3870: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
3880: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3890: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
38a0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
38b0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
38c0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
38d0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
38e0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
38f0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
3900: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
3910: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
3920: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
3930: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
3940: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
3950: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
3960: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
3970: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
3980: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3990: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
39a0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
39b0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
39c0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
39d0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
39e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
39f0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
3a00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3a10: 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20  leteTable(Table 
3a20: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3a30: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3a40: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
3a50: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20  , *pNextFKey;.. 
3a60: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
3a70: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44   return;..  /* D
3a80: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
3a90: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
3aa0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3ab0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3ac0: 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  /.  pTable->nRef
3ad0: 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  --;.  if( pTable
3ae0: 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
3af0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3b00: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52  sert( pTable->nR
3b10: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  ef==0 );..  /* D
3b20: 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  elete all indice
3b30: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3b40: 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a  h this table.  *
3b50: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
3b60: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
3b70: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
3b80: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
3b90: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3ba0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
3bb0: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
3bc0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
3bd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
3be0: 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  eteIndex(pIndex)
3bf0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
3c00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
3c10: 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65  GN_KEY.  /* Dele
3c20: 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b  te all foreign k
3c30: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
3c40: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
3c50: 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73   The keys.  ** s
3c60: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
3c70: 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  dy been unlinked
3c80: 20 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d   from the pSchem
3c90: 61 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  a->aFKey hash ta
3ca0: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
3cb0: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
3cc0: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
3cd0: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
3ce0: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
3cf0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
3d00: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3d10: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61  te3HashFind(&pTa
3d20: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  ble->pSchema->aF
3d30: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c  pFKey->zTo, strl
3d60: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31  en(pFKey->zTo)+1
3d70: 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20  )!=pFKey );.    
3d80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b  sqlite3_free(pFK
3d90: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
3da0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
3db0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
3dc0: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
3dd0: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
3de0: 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a  nNames(pTable);.
3df0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3e00: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
3e10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3e20: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
3e30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3e40: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
3e50: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
3e60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
3e70: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
3e80: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43  elete(pTable->pC
3e90: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3ea0: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
3eb0: 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  (pTable);.  sqli
3ec0: 74 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29  te3_free(pTable)
3ed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
3ee0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
3ef0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3f00: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
3f10: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
3f20: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
3f30: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
3f40: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
3f50: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
3f60: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3f70: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
3f80: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3f90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
3fa0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
3fb0: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
3fc0: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
3fd0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
3fe0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
3ff0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
4000: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4010: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
4020: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
4030: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
4040: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
4050: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
4060: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
4070: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c  , zTabName, strl
4080: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30  en(zTabName)+1,0
4090: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69  );.  if( p ){.#i
40a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
40b0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
40c0: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
40d0: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
40e0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
40f0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
4100: 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b  rlen(pF1->zTo) +
4110: 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20   1;.      pF2 = 
4120: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
4130: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61  &pDb->pSchema->a
4140: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
4150: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
4160: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
4170: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4180: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4190: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
41a0: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
41b0: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20  pNextTo);.      
41c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
41d0: 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32  hile( pF2 && pF2
41e0: 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29  ->pNextTo!=pF1 )
41f0: 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74  { pF2=pF2->pNext
4200: 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  To; }.        if
4210: 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20  ( pF2 ){.       
4220: 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20     pF2->pNextTo 
4230: 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a  = pF1->pNextTo;.
4240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4250: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
4260: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
4270: 54 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Table(p);.  }.  
4280: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
4290: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
42a0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  s;.}../*.** Give
42b0: 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  n a token, retur
42c0: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
42d0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
42e0: 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20  text of that.** 
42f0: 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71  token with any q
4300: 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65  uotations remove
4310: 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  d.  Space to hol
4320: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
4330: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
4340: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4350: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4360: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4370: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4380: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  ction..**.** Tok
4390: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
43a0: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
43b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
43c0: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
43d0: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
43e0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
43f0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
4400: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
4410: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
4420: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
4430: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
4440: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
4450: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
4460: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4470: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
4480: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
4490: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
44a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
44b0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
44c0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
44d0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
44e0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
44f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
4500: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
4510: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
4520: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
4530: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
4540: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
4550: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
4560: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
4570: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
4580: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
4590: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
45a0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
45b0: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
45c0: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
45d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
45e0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
45f0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
4600: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
4610: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
4620: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
4630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4640: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
4650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4660: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
4670: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
4680: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
4690: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
46a0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
46b0: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
46c0: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
46d0: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
46e0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
46f0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
4700: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
4710: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
4720: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
4730: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
4740: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
4750: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
4760: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
4770: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4780: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4790: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
47a0: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
47b0: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
47c0: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
47d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
47e0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
47f0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20  t i = -1;    /* 
4800: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
4810: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
4820: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4830: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
4840: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20  he name */.  Db 
4850: 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41  *pDb;       /* A
4860: 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20   database whose 
4870: 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65  name space is be
4880: 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a  ing searched */.
4890: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
48a0: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
48b0: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
48c0: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ..  zName = sqli
48d0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
48e0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
48f0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4900: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
4910: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  );.    for(i=(db
4920: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
4930: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
4940: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
4950: 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54      if( (!OMIT_T
4960: 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20  EMPDB || i!=1 ) 
4970: 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62  && n==strlen(pDb
4980: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
4990: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
49a0: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
49b0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
49c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
49d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
49e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
49f0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4a00: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4a10: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4a20: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4a30: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4a40: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4a50: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
4a60: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4a70: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4a80: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4a90: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
4aa0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4ab0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4ac0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4ad0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4ae0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4af0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4b00: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4b10: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4b20: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4b30: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4b40: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4b50: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
4b60: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4b70: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
4b80: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
4b90: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4ba0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4bb0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4bc0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4bd0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4be0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4bf0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4c00: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4c10: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4c20: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4c30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4c40: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
4c50: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
4c60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
4c70: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
4c80: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
4c90: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
4ca0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
4cb0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
4cc0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4cd0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
4ce0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
4cf0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
4d00: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4d10: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
4d20: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
4d30: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
4d40: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
4d50: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
4d60: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4d80: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
4d90: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
4da0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4db0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
4dc0: 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65   pName2 && pName
4dd0: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  2->n>0 ){.    as
4de0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
4df0: 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e  busy );.    *pUn
4e00: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
4e10: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
4e20: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
4e30: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
4e40: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
4e50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4e60: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
4e70: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
4e80: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
4e90: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
4ea0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
4eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
4ec0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
4ed0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
4ee0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
4ef0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
4f00: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
4f10: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
4f20: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
4f30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4f40: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
4f50: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
4f60: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
4f70: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
4f80: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
4f90: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
4fa0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
4fb0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
4fc0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
4fd0: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
4fe0: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
4ff0: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
5000: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
5010: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
5020: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
5030: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
5040: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
5050: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
5060: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
5070: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
5080: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
5090: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
50a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
50b0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
50c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
50d0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
50e0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
50f0: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5100: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
5110: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
5120: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
5130: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
5140: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
5150: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5160: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5170: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
5180: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
5190: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
51a0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
51b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
51c0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
51d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
51e0: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
51f0: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
5200: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
5210: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
5220: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
5230: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
5240: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
5250: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
5260: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
5270: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5280: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
5290: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
52a0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
52b0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
52c0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
52d0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
52e0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
52f0: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
5300: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
5310: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
5320: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
5330: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
5340: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
5350: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
5360: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
5370: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
5380: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
5390: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
53a0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
53b0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
53c0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
53d0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
53e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
53f0: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
5400: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
5410: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
5420: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
5430: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
5440: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
5450: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
5460: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
5470: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
5480: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
5490: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
54a0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
54b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
54c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
54d0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
54e0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
54f0: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
5500: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
5510: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
5520: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5530: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
5540: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
5550: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5560: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
5570: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5580: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
5590: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
55a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
55b0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
55c0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
55d0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
55e0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
55f0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5600: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
5610: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
5620: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
5630: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
5640: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
5650: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5660: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
5670: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
5680: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5690: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
56a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
56b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
56c0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
56d0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
56e0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
56f0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5700: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5710: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5720: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5730: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5740: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5750: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5760: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5770: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
5780: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
5790: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
57a0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
57b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
57c0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
57d0: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
57e0: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
57f0: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5800: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5810: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5820: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5830: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5840: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5850: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5860: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
5870: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5880: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
5890: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
58a0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
58b0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
58c0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
58d0: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
58e0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
58f0: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5900: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5910: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5920: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5930: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5940: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5950: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5960: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5970: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5980: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5990: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
59a0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
59b0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
59c0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
59d0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
59e0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
59f0: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5a00: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5a10: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5a20: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5a30: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5a40: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5a50: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5a60: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5a70: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5a80: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5a90: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5aa0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5ab0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5ac0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5ad0: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5ae0: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5af0: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5b00: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5b10: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5b20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5b30: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5b40: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5b50: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5b60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5b70: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5b80: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5b90: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5ba0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5bb0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5bc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5bd0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5be0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5bf0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5c00: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5c10: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5c20: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
5c30: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
5c40: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5c50: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
5c60: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
5c70: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
5c80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c90: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5ca0: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
5cb0: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
5cc0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
5cd0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
5ce0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
5cf0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
5d00: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5d10: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
5d20: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
5d30: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
5d40: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
5d50: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5d60: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
5d70: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
5d80: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
5d90: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5da0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5db0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5dc0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
5dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
5de0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5df0: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
5e00: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5e10: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
5e20: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
5e30: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5e40: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5e50: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
5e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
5e70: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5e80: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
5e90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5ea0: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
5eb0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
5ec0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
5ed0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
5ee0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
5ef0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5f00: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
5f10: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
5f20: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
5f30: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
5f40: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
5f50: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
5f60: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
5f70: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
5f80: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
5f90: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
5fa0: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
5fb0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
5fc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
5fd0: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
5fe0: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
5ff0: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
6000: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
6010: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
6020: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6030: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
6040: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
6050: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
6060: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
6070: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
6080: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
6090: 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f  if( !IN_DECLARE_
60a0: 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20  VTAB ){.    if( 
60b0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
60c0: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
60d0: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
60e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
60f0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6100: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
6110: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
6120: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
6130: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
6140: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6150: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6170: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6180: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
6190: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
61a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
61c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
61d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
61e0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
61f0: 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62  e, 0)!=0 && (iDb
6200: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
6210: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
6220: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6230: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
6240: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
6250: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
6260: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
6270: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6280: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
6290: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
62a0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
62b0: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
62c0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
62d0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
62e0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70  ailed = 1;.    p
62f0: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
6300: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
6310: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6320: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6330: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
6340: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
6350: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
6360: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
6370: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
6380: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
6390: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
63a0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28  >nRef = 1;.  if(
63b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
63c0: 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65  le ) sqlite3Dele
63d0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  teTable(pParse->
63e0: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
63f0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
6400: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
6410: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
6420: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
6430: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
6440: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
6450: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
6460: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
6470: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
6480: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
6490: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
64a0: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
64b0: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
64c0: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
64d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
64e0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
64f0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
6500: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
6510: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
6520: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
6530: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
6540: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
6550: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
6560: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
6570: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
6580: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
6590: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
65a0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
65b0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
65c0: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
65d0: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
65e0: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
65f0: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
6600: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
6610: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6620: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
6630: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
6640: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
6650: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
6660: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
6670: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
6680: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
6690: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
66a0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
66b0: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
66c0: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
66d0: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
66e0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
66f0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
6700: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
6710: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
6720: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
6730: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
6740: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
6750: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
6760: 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69 6e   int lbl;.    in
6770: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
6780: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
6790: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
67a0: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23  rse, 0, iDb);..#
67b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
67c0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
67d0: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
67e0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
67f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6800: 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 29 3b  P_VBegin, 0, 0);
6810: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
6820: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
6830: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
6840: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
6850: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
6860: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
6870: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
6880: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
6890: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
68a0: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
68b0: 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f  , 1);   /* file_
68c0: 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62  format */.    lb
68d0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
68e0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
68f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6900: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c  p(v, OP_If, 0, l
6910: 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  bl);.    fileFor
6920: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
6930: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
6940: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
6970: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
6980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6990: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
69a0: 66 69 6c 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a  fileFormat, 0);.
69b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
69c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
69d0: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
69e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69f0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6a00: 72 2c 20 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a  r, ENC(db), 0);.
6a10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a20: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6a30: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20  okie, iDb, 4);. 
6a40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
6a50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
6a60: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  l);..    /* This
6a70: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
6a80: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
6a90: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
6aa0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
6ab0: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
6ac0: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
6ad0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
6ae0: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
6af0: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
6b00: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
6b10: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
6b20: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
6b30: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
6b40: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6b50: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
6b60: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
6b70: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
6b80: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
6b90: 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   The rowid value
6ba0: 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68   is needed by th
6bb0: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
6bc0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
6bd0: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
6be0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
6bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6c00: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
6c10: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6c20: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
6c30: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
6c40: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6c50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c60: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6c70: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
6c80: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
6c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6ca0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6cb0: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6cc0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6cd0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6ce0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6d00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
6d10: 77 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20  wRowid, 0, 0);. 
6d20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6d30: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6d40: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6d50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6d60: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
6d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d80: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
6d90: 20 30 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e   0, OPFLAG_APPEN
6da0: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
6db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6dc0: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
6dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6de0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
6df0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e   0);.  }..  /* N
6e00: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
6e10: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
6e20: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
6e30: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
6e40: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
6e50: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
6e60: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  or:.  sqlite3_fr
6e70: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
6e80: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
6e90: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
6ea0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
6eb0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
6ec0: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
6ed0: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
6ee0: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
6ef0: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
6f00: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
6f10: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
6f20: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
6f30: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
6f40: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
6f50: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
6f60: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
6f70: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
6f80: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
6f90: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
6fa0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
6fb0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
6fc0: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
6fd0: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
6fe0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
6ff0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7000: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7010: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7020: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7030: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7040: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
7050: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
7060: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
7070: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
7080: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
7090: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
70a0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
70b0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
70c0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
70d0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
70e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
70f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7100: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7110: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7120: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7130: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7140: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
7150: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7160: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
7170: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
7180: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
7190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
71a0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
71b0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
71c0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
71d0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
71e0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
71f0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
7200: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
7210: 6e 43 6f 6c 2b 31 3e 53 51 4c 49 54 45 5f 4d 41  nCol+1>SQLITE_MA
7220: 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
7230: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7240: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
7250: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
7260: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
7270: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
7280: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
7290: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
72a0: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
72b0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
72c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
72d0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
72e0: 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20   if( STRICMP(z, 
72f0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
7300: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7310: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7320: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
7330: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
7340: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
7350: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
7360: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7370: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
7380: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
7390: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
73a0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
73b0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 20 70 2d 3e  te3_realloc( p->
73c0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
73d0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
73e0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
73f0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
7400: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
7410: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
7420: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7430: 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (z);.      retur
7440: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
7450: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
7460: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
7470: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
7480: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
7490: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
74a0: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
74b0: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
74c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
74d0: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
74e0: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
74f0: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
7500: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
7510: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
7520: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
7530: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
7540: 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20  ype() will.  ** 
7550: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
7560: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
7570: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
7580: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
7590: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
75a0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43  FF_NONE;.  p->nC
75b0: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
75c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
75d0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
75e0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
75f0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
7600: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
7610: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7620: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
7630: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
7640: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
7650: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
7660: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
7670: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
7680: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
7690: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
76a0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
76b0: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
76c0: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
76d0: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
76e0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
76f0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
7700: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7710: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7720: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
7730: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
7740: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
7750: 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  l = onError;.}..
7760: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
7770: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
7780: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
7790: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
77a0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
77b0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
77c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
77d0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
77e0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
77f0: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
7800: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
7810: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
7820: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
7830: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7840: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
7850: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7860: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
7870: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
7880: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
7890: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
78a0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
78b0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
78c0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
78d0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
78e0: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
78f0: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
7900: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
7910: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7920: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
7930: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
7940: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
7980: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
7990: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
79a0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
79b0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
79c0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
79d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
79e0: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
79f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7a00: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
7a10: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
7a20: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
7a30: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7a40: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
7a50: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7a60: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
7a70: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7a80: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
7a90: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
7aa0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
7ab0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
7ac0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
7ad0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7ae0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
7af0: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
7b00: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54  nityType(const T
7b10: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
7b20: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
7b30: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
7b40: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
7b50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
7b60: 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e  r *zIn = pType->
7b70: 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  z;.  const unsig
7b80: 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d  ned char *zEnd =
7b90: 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65   &pType->z[pType
7ba0: 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ->n];..  while( 
7bb0: 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20  zIn!=zEnd ){.   
7bc0: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
7bd0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7be0: 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e  r[*zIn];.    zIn
7bf0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
7c00: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
7c10: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
7c20: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
7c30: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
7c40: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7c50: 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65  FF_TEXT; .    }e
7c60: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
7c70: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7c80: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
7c90: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
7ca0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7cb0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7cc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7cd0: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
7ce0: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
7cf0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
7d00: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
7d10: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7d20: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
7d30: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
7d40: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
7d50: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
7d60: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
7d70: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
7d80: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7d90: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
7da0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
7db0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7dc0: 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66  FF_NONE;.#ifndef
7dd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
7de0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
7df0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7e00: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
7e10: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
7e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
7e30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
7e40: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
7e50: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
7e60: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7e70: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
7e80: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
7e90: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7ea0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
7eb0: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
7ec0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
7ed0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7ee0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
7ef0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7f10: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
7f20: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
7f30: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
7f40: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
7f50: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
7f60: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
7f70: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7f80: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
7f90: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
7fa0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
7fb0: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
7fc0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7fd0: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
7fe0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7ff0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
8000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8010: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  }..  return aff;
8020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8030: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8040: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8050: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8060: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8070: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8080: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
8090: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
80a0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
80b0: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
80c0: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
80d0: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
80e0: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
80f0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8100: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8110: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
8120: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
8130: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
8140: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
8150: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
8160: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
8170: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
8180: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
8190: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
81a0: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
81b0: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
81c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
81d0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
81e0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
81f0: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
8200: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  *p;.  int i;.  C
8210: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20  olumn *pCol;..  
8220: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8230: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
8240: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
8250: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
8260: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
8270: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
8280: 69 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  i];.  sqlite3_fr
8290: 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  ee(pCol->zType);
82a0: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
82b0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
82c0: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
82d0: 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  , pType);.  pCol
82e0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
82f0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
8300: 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pType);.}../*.*
8310: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
8320: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
8330: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
8340: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
8350: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
8360: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8370: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8380: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
8390: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
83a0: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
83b0: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
83c0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
83d0: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
83e0: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
83f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8400: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8410: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8420: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8430: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8440: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
8450: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8460: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
8470: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8480: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61  pr *pExpr){.  Ta
8490: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
84a0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
84b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
84c0: 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  able)!=0 ){.    
84d0: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
84e0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
84f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
8500: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
8510: 6e 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b  nction(pExpr) ){
8520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8530: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8540: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
8550: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
8560: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
8570: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
8580: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
8590: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
85a0: 6f 70 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  opy;.      sqlit
85b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
85c0: 3e 64 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >db;.      sqlit
85d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
85e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
85f0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70   pCol->pDflt = p
8600: 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78  Copy = sqlite3Ex
8610: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 29  prDup(db, pExpr)
8620: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 70  ;.      if( pCop
8630: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  y ){.        sql
8640: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
8650: 2c 20 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20  , &pCopy->span, 
8660: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
8670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8680: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
8690: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a  lete(pExpr);.}..
86a0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
86b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
86c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
86d0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
86e0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
86f0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
8700: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
8710: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
8720: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
8730: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
8740: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
8750: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
8760: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
8770: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
8780: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
8790: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
87a0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
87b0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
87c0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
87d0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
87e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
87f0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
8800: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
8810: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8820: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
8830: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
8840: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
8850: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
8860: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
8870: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
8880: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
8890: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
88a0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
88b0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
88c0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
88d0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
88e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
88f0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
8900: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
8910: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
8920: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
8930: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
8940: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
8950: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
8960: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
8970: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
8980: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
8990: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
89a0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
89b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
89c0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
89d0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
89e0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
89f0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8a00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8a10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8a20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
8a30: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
8a40: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
8a50: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
8a60: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
8a70: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
8a80: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
8a90: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
8aa0: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
8ab0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
8ac0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
8ad0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
8ae0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
8af0: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
8b00: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
8b10: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
8b20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8b30: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
8b40: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
8b50: 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61  -1, i;.  if( pTa
8b60: 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  b==0 || IN_DECLA
8b70: 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70  RE_VTAB ) goto p
8b80: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
8b90: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73  .  if( pTab->has
8ba0: 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73  PrimKey ){.    s
8bb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8bc0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
8bd0: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
8be0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
8bf0: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
8c00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
8c10: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8c20: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
8c30: 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  >hasPrimKey = 1;
8c40: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
8c50: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
8c60: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
8c70: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
8c80: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
8c90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
8ca0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
8cb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8cc0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
8cd0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
8ce0: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
8cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8d00: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
8d10: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
8d20: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
8d30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8d40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
8d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8d60: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
8d70: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
8d80: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
8d90: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8da0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8db0: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
8dc0: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
8dd0: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
8de0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8df0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
8e00: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
8e10: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
8e20: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
8e30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
8e40: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
8e50: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f  =0.        && so
8e60: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
8e70: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54  SO_ASC ){.    pT
8e80: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
8e90: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
8ea0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
8eb0: 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63     pTab->autoInc
8ec0: 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65   = autoInc;.  }e
8ed0: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
8ee0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
8ef0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
8f00: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
8f10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8f20: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
8f30: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
8f40: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
8f50: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8f60: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
8f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8f80: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
8f90: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
8fa0: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
8fb0: 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20  , 0, sortOrder, 
8fc0: 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  0);.    pList = 
8fd0: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
8fe0: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
8ff0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9000: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
9010: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
9020: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
9030: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
9040: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
9050: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9060: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9070: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
9080: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
9090: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
90a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
90b0: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
90c0: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
90d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
90e0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
90f0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
9100: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
9110: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9120: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9130: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
9140: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
9150: 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
9160: 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65 78   /* The CHECK ex
9170: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
9180: 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20 74   duplicated so t
9190: 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65 72  hat tokens refer
91a0: 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f  .    ** to mallo
91b0: 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e 6f  ced space and no
91c0: 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61 6c  t the (ephemeral
91d0: 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  ) text of the CR
91e0: 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20 2a  EATE TABLE.    *
91f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  * statement */. 
9200: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
9210: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
9220: 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  (db, pTab->pChec
9230: 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  k, .            
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9260: 72 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b 45  rDup(db, pCheckE
9270: 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xpr));.  }.#endi
9280: 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  f.  sqlite3ExprD
9290: 65 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72  elete(pCheckExpr
92a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
92b0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
92c0: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
92d0: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
92e0: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
92f0: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
9300: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
9310: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
9320: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
9330: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
9340: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
9350: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
9360: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
9370: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
9380: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
9390: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
93a0: 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28 20 73 71  Col-1;..  if( sq
93b0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
93c0: 65 71 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  eq(pParse, zType
93d0: 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20 20 20 20  , nType) ){.    
93e0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
93f0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
9400: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
9410: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
9420: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a   zType, nType);.
9430: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
9440: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
9450: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
9460: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
9470: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20  TE <type>",.    
9480: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
9490: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
94a0: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
94b0: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
94c0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  .    ** collatio
94d0: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
94e0: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
94f0: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
9500: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9510: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9520: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9530: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9540: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
9550: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
9560: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
9570: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20  lumn[0]==i ){.  
9580: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
9590: 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b  ll[0] = p->aCol[
95a0: 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  i].zColl;.      
95b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
95c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
95d0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
95e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
95f0: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
9600: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
9610: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
9620: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
9630: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
9640: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
9650: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
9660: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
9670: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
9680: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
9690: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
96a0: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
96b0: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
96c0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
96d0: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
96e0: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
96f0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9700: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
9710: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
9720: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
9730: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
9740: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
9750: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
9760: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
9770: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
9780: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
9790: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
97a0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
97b0: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
97c0: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
97d0: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
97e0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
97f0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
9800: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
9810: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
9820: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9830: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
9840: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
9850: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
9860: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
9870: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
9880: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9890: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
98a0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
98b0: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
98c0: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
98d0: 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c  message..*/.Coll
98e0: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
98f0: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
9900: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9910: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
9920: 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  nName){.  sqlite
9930: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9940: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
9950: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
9960: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
9970: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
9980: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
9990: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
99a0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
99b0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e  zName, nName, in
99c0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
99d0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
99e0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
99f0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
9a00: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
9a10: 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c  llSeq(db, pColl,
9a20: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
9a30: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9a40: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  {.      if( nNam
9a50: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  e<0 ){.        n
9a60: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
9a70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
9a80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9a90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
9aa0: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
9ab0: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
9ac0: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  nName, zName);. 
9ad0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a       pColl = 0;.
9ae0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9af0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
9b00: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9b10: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
9b20: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
9b30: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
9b40: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
9b50: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
9b60: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
9b70: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
9b80: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
9b90: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
9ba0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
9bb0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
9bc0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
9bd0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
9be0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
9bf0: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
9c00: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
9c10: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
9c20: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
9c30: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
9c40: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
9c50: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
9c60: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
9c70: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
9c80: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
9c90: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
9ca0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
9cb0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
9cc0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
9cd0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
9ce0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
9cf0: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
9d00: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
9d10: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
9d20: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
9d30: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
9d40: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
9d50: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
9d60: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
9d70: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
9d80: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
9d90: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
9da0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
9db0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
9dc0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
9dd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
9de0: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  geCookie(sqlite3
9df0: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
9e00: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
9e10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9e20: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
9e30: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
9e40: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
9e50: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
9e60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9e70: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30  etCookie, iDb, 0
9e80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
9e90: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
9ea0: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
9eb0: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
9ec0: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
9ed0: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
9ee0: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
9ef0: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
9f00: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
9f10: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
9f20: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
9f30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
9f40: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
9f50: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
9f60: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
9f70: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
9f80: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
9f90: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
9fa0: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
9fb0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
9fc0: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
9fd0: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
9fe0: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
9ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
a000: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   2;.}../*.** Wri
a010: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
a020: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
a030: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
a040: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
a050: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
a060: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a070: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
a080: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
a090: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
a0a0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
a0b0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
a0c0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a0d0: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
a0e0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
a0f0: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
a100: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
a110: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a120: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
a130: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a140: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a150: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a160: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
a170: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
a180: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a1a0: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
a1b0: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
a1c0: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
a1d0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
a1e0: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
a1f0: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a200: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
a210: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
a220: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
a230: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
a240: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
a250: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a260: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
a270: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
a280: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a290: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
a2a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
a2b0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
a2c0: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
a2d0: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
a2e0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
a2f0: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
a300: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a310: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
a320: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
a330: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
a340: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a350: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
a360: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c  leStmt(Table *p,
a370: 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20   int isTemp){.  
a380: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
a390: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
a3a0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
a3b0: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
a3c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
a3d0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
a3e0: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
a3f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a400: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
a410: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a420: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a430: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
a440: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
a450: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
a460: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
a470: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
a480: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
a490: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
a4a0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
a4b0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
a4c0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
a4d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
a4e0: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
a4f0: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
a500: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
a510: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
a520: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
a530: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
a540: 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  _malloc( n );.  
a550: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
a560: 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
a570: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
a580: 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Stmt,.          
a590: 20 20 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45          !OMIT_TE
a5a0: 4d 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22  MPDB&&isTemp ? "
a5b0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
a5c0: 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c  E ":"CREATE TABL
a5d0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
a5e0: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
a5f0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a600: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
a610: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
a620: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
a630: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a640: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a650: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
a660: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
a670: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
a680: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
a690: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
a6a0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
a6b0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a6c0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
a6d0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
a6e0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
a6f0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
a700: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
a710: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
a720: 29 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20  )+k+1<=n );.    
a730: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a740: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
a750: 5d 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ], "%s", z);.   
a760: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a     k += strlen(z
a770: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a780: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a790: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
a7a0: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
a7b0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
a7c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a7d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a7e0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
a7f0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
a800: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
a810: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
a830: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a840: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
a850: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
a860: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
a870: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
a880: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
a890: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
a8a0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
a8b0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
a8c0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
a8d0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
a8e0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a8f0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
a900: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
a910: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
a920: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a930: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
a940: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
a950: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
a960: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
a970: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
a980: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
a990: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
a9a0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
a9b0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
a9c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
a9d0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
a9e0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
a9f0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
aa00: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
aa10: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
aa20: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
aa30: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
aa40: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
aa50: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
aa60: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
aa70: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
aa80: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
aa90: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
aaa0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
aab0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
aac0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
aad0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
aae0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
aaf0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
ab00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ab10: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ab20: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
ab30: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ab40: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
ab50: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
ab60: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
ab70: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ab80: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
ab90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
aba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
abb0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
abc0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
abd0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
abe0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
abf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
ac00: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
ac10: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
ac20: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
ac30: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
ac40: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
ac50: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
ac60: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
ac70: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
ac80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ac90: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
aca0: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
acb0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
acc0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
acd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ace0: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
acf0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
ad00: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
ad10: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ad20: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
ad30: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
ad40: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
ad50: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
ad60: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
ad70: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
ad80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ad90: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
ada0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
adb0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
adc0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
add0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
ade0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
adf0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
ae00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
ae10: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
ae20: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
ae30: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
ae40: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
ae50: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
ae60: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
ae70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
ae80: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
ae90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
aea0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
aeb0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
aec0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
aed0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
aee0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
aef0: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
af00: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
af10: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
af20: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
af30: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
af40: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
af50: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
af60: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
af70: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
af80: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
af90: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
afa0: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
afb0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
afc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
afd0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
afe0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
aff0: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b000: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
b010: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b020: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
b030: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
b040: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
b050: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
b060: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
b070: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
b080: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
b090: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
b0a0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
b0b0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
b0c0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
b0d0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
b0e0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
b0f0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
b100: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
b110: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
b120: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
b130: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
b140: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
b150: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
b160: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
b170: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
b180: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
b190: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
b1a0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
b1b0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
b1c0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
b1d0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
b1e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
b1f0: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
b200: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b210: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
b220: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
b230: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
b240: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
b250: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
b260: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
b270: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
b280: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
b290: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
b2a0: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
b2b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
b2c0: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
b2d0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
b2e0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
b2f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
b300: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
b310: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
b320: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
b330: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
b340: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
b350: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
b360: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
b370: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
b380: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
b390: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
b3a0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b3b0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
b3c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
b3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3e0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b3f0: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0);..    /* 
b400: 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
b410: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
b420: 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69  table and push i
b430: 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
b440: 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20  ..    ** A view 
b450: 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c  has no rootpage,
b460: 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20   so just push a 
b470: 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74  zero onto the st
b480: 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76  ack for.    ** v
b490: 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a  iews.  Initializ
b4a0: 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20 73  e zType at the s
b4b0: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f  ame time..    */
b4c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
b4d0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
b4e0: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
b4f0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
b500: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
b510: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
b520: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
b530: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
b540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
b550: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
b560: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
b570: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
b580: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
b590: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
b5a0: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
b5b0: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
b5c0: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
b5d0: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
b5e0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
b5f0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
b600: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
b610: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
b620: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
b630: 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65   table is on the
b640: 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65   top of the vdbe
b650: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20   stack..    **. 
b660: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
b670: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
b680: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
b690: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
b6a0: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
b6b0: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
b6c0: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
b6d0: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
b6e0: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
b6f0: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
b700: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
b710: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
b720: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
b730: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
b740: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
b750: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
b760: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
b770: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
b780: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
b790: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
b7a0: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
b7b0: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
b7c0: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
b7d0: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
b7e0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
b7f0: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
b800: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
b810: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
b820: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
b830: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
b840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b850: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
b860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b870: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b880: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
b890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b8b0: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
b8c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
b8d0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
b8e0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
b8f0: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
b900: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
b910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b920: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b930: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
b940: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
b950: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
b960: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
b970: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
b980: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
b990: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
b9a0: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
b9b0: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
b9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
b9d0: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
b9e0: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
b9f0: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
ba00: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
ba10: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
ba20: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
ba30: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
ba40: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
ba50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
ba60: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
ba70: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
ba80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ba90: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
baa0: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
bab0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
bac0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
bad0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
bae0: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
baf0: 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68  eStmt(p, p->pSch
bb00: 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d  ema==pParse->db-
bb10: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
bb20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bb30: 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d     n = pEnd->z -
bb40: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
bb50: 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20  ken.z + 1;.     
bb60: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
bb70: 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20  MPrintf("CREATE 
bb80: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
bb90: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
bba0: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
bbb0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
bbc0: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
bbd0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
bbe0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
bbf0: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
bc00: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
bc10: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
bc20: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
bc30: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
bc40: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
bc50: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
bc60: 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  .  The rowid for
bc70: 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65   the preallocate
bc80: 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  d.    ** slot is
bc90: 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e   the 2nd item on
bca0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65   the stack.  The
bcb0: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
bcc0: 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  k is the.    ** 
bcd0: 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68  root page for th
bce0: 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20  e new table (or 
bcf0: 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61  a 0 if this is a
bd00: 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20   view)..    */. 
bd10: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
bd20: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
bd30: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
bd40: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
bd50: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
bd60: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
bd70: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20  Q, rootpage=#0, 
bd80: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
bd90: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22  "WHERE rowid=#1"
bda0: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
bdb0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
bdc0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
bdd0: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
bde0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
bdf0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
be00: 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
be10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be20: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
be30: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
be40: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69  db, v, iDb);..#i
be50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
be60: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
be70: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
be80: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
be90: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
bea0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
beb0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
bec0: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
bed0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
bee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bef0: 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20   p->autoInc ){. 
bf00: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
bf10: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
bf20: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
bf30: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
bf40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bf50: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
bf60: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
bf70: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
bf80: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
bf90: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
bfa0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
bfb0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
bfc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
bfd0: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
bfe0: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
bff0: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
c000: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
c010: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
c020: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
c030: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
c040: 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  b, 0,.        sq
c050: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62  lite3MPrintf("tb
c060: 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e  l_name='%q'",p->
c070: 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
c080: 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  IC);.  }...  /* 
c090: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
c0a0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
c0b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
c0c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
c0d0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
c0e0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
c0f0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
c100: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
c110: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20     FKey *pFKey; 
c120: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
c130: 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
c140: 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  a;.    pOld = sq
c150: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
c160: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
c170: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
c180: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
c190: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
c1a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c1b0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
c1c0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
c1d0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
c1e0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
c1f0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
c200: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
c210: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c220: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c230: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
c240: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
c250: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
c260: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
c270: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
c280: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
c290: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
c2a0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
c2b0: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
c2c0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
c2d0: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
c2e0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
c2f0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c300: 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  t(&pSchema->aFKe
c310: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
c320: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
c330: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
c340: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
c350: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
c360: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
c370: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
c380: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
c390: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c3a0: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
c3b0: 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
c3c0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
c3d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
c3e0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72  onst char *)pPar
c3f0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
c400: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
c410: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
c420: 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
c430: 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
c440: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
c450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
c460: 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
c470: 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65     }.      nName
c480: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
c490: 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
c4a0: 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43  e;.      p->addC
c4b0: 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20  olOffset = 13 + 
c4c0: 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
c4d0: 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  en(zName, nName)
c4e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c4f0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
c500: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
c510: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
c520: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
c530: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
c540: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
c550: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c560: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
c570: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c580: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
c590: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
c5a0: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
c5b0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
c5c0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
c5d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
c5e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
c5f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
c600: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
c610: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
c620: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
c630: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
c640: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
c650: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
c660: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
c670: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
c680: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
c690: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
c6a0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
c6b0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
c6c0: 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
c6d0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
c6e0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
c6f0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
c700: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
c710: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
c720: 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
c730: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
c740: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
c750: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
c760: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
c770: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
c780: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
c790: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Name;.  int iDb;
c7a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c7b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
c7c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
c7d0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
c7e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c7f0: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
c800: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
c810: 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
c820: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c830: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c840: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
c850: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
c860: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c870: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
c880: 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
c890: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
c8a0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
c8b0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
c8c0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
c8d0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
c8e0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
c8f0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
c900: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
c910: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
c920: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
c930: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
c940: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
c950: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28  >pSchema);.  if(
c960: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
c970: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
c980: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
c990: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
c9a0: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
c9b0: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
c9c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c9d0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
c9e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c9f0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
ca00: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
ca10: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ca20: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
ca30: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
ca40: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
ca50: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
ca60: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
ca70: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
ca80: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
ca90: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
caa0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
cab0: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
cac0: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
cad0: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
cae0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
caf0: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
cb00: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
cb10: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
cb20: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
cb30: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
cb40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
cb50: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
cb60: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
cb70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
cb80: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  rn;.  }.  if( !d
cb90: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
cba0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
cbb0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
cbc0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
cbd0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
cbe0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
cbf0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
cc00: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
cc10: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
cc20: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
cc30: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
cc40: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
cc50: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
cc60: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
cc70: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
cc80: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
cc90: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
cca0: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
ccb0: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
ccc0: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
ccd0: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
cce0: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
ccf0: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
cd00: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
cd10: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
cd20: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
cd30: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
cd40: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
cd50: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
cd60: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
cd70: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
cd80: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
cd90: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
cda0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
cdb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cdc0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
cdd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
cde0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
cdf0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
ce00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ce10: 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
ce20: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
ce30: 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
ce40: 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
ce50: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
ce60: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
ce70: 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
ce80: 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
ce90: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
cea0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
ceb0: 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
cec0: 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
ced0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
cee0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
cef0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
cf00: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
cf10: 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
cf20: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
cf30: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
cf40: 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
cf50: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
cf60: 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
cf70: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
cf80: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
cf90: 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
cfa0: 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
cfb0: 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
cfc0: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
cfd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cfe0: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
cff0: 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
d000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d010: 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
d020: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d030: 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
d040: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d050: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
d060: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d070: 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
d080: 63 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20 20 61  c errors */..  a
d090: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
d0a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d0b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d0c0: 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
d0d0: 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
d0e0: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
d0f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d100: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
d110: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
d120: 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
d130: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
d140: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d150: 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
d160: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
d170: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
d180: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
d190: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
d1a0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
d1b0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
d1c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
d1d0: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
d1e0: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
d1f0: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
d200: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
d210: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
d220: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
d230: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
d240: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
d250: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
d260: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
d270: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
d280: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
d290: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
d2a0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
d2b0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
d2c0: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
d2d0: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
d2e0: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
d2f0: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
d300: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
d310: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
d320: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
d330: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
d340: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
d350: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
d360: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
d370: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
d380: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
d390: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
d3a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
d3b0: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
d3c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d3d0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
d3e0: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
d3f0: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
d400: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
d410: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
d420: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
d430: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
d440: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
d450: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
d460: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
d470: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
d480: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
d490: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
d4a0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
d4b0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
d4c0: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
d4d0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
d4e0: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
d4f0: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
d500: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
d510: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
d520: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
d530: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
d540: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
d550: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
d560: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
d570: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
d580: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
d590: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
d5a0: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
d5b0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
d5c0: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
d5d0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d5e0: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
d5f0: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
d600: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
d610: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  e->pSelect);.  i
d620: 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e  f( pSel ){.    n
d630: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
d640: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
d650: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
d660: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
d670: 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
d680: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
d690: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
d6a0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d6b0: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
d6c0: 53 65 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65  Sel);.    pParse
d6d0: 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20  ->nTab = n;.    
d6e0: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
d6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
d700: 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
d710: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
d720: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
d730: 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  ol;.      pTable
d740: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
d750: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
d760: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
d770: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
d780: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
d790: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
d7a0: 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  le(pSelTab);.   
d7b0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
d7c0: 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f  ma->flags |= DB_
d7d0: 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
d7e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
d7f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
d800: 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
d810: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d820: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
d830: 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  l);.  } else {. 
d840: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23     nErr++;.  }.#
d850: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d860: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
d870: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
d880: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
d890: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
d8a0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
d8b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
d8c0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
d8d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d8e0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
d8f0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
d900: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
d910: 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
d920: 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
d930: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
d940: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
d950: 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
d960: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
d970: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
d980: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
d990: 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
d9a0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
d9b0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
d9c0: 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
d9d0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
d9e0: 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
d9f0: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
da00: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
da10: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
da20: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
da30: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
da40: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
da50: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
da60: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
da70: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
da80: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
da90: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
daa0: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
dab0: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
dac0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
dad0: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
dae0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
daf0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
db00: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
db10: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
db20: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
db30: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
db40: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
db50: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
db60: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
db70: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
db80: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
db90: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
dba0: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
dbb0: 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
dbc0: 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
dbd0: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
dbe0: 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
dbf0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
dc00: 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
dc10: 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
dc20: 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
dc30: 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
dc40: 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
dc50: 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
dc60: 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
dc70: 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
dc80: 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
dc90: 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
dca0: 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
dcb0: 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
dcc0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
dcd0: 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
dce0: 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
dcf0: 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
dd00: 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
dd10: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
dd20: 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
dd30: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
dd40: 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
dd50: 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
dd60: 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
dd70: 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
dd80: 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
dd90: 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
dda0: 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
ddb0: 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
ddc0: 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
ddd0: 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
dde0: 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
ddf0: 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
de00: 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
de10: 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
de20: 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
de30: 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
de40: 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
de50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
de60: 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
de70: 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
de80: 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  ed(Db *pDb, int 
de90: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
dea0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
deb0: 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
dec0: 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70  h;..  pHash = &p
ded0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
dee0: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
def0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
df00: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
df10: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
df20: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
df30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
df40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
df50: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
df60: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
df70: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
df80: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
df90: 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
dfa0: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
dfb0: 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
dfc0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
dfd0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
dfe0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
dff0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
e000: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
e010: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
e020: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
e030: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
e040: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
e050: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
e060: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
e070: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
e080: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
e090: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
e0a0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
e0b0: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
e0c0: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
e0d0: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
e0e0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e0f0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
e100: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
e110: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
e120: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
e130: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
e140: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
e150: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
e160: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
e170: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
e180: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
e190: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
e1a0: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
e1b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
e1c0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
e1d0: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
e1e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e1f0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
e200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e210: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
e220: 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64  ble, iDb);.#ifnd
e230: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e240: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
e250: 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73  P_Destroy pushes
e260: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f   an integer onto
e270: 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74   the stack. If t
e280: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
e290: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
e2a0: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
e2b0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
e2c0: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
e2d0: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
e2e0: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
e2f0: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
e300: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
e310: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
e320: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
e330: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
e340: 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20  "#0" in the SQL 
e350: 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
e360: 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
e370: 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
e380: 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74    ** is on the t
e390: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
e3a0: 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67    See sqlite3Reg
e3b0: 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a  isterExpr()..  *
e3c0: 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
e3d0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
e3e0: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
e3f0: 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
e400: 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20  %d WHERE #0 AND 
e410: 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20  rootpage=#0",.  
e420: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
e430: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
e440: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
e450: 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , iTable);.#endi
e460: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  f.}../*.** Write
e470: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
e480: 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
e490: 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
e4a0: 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
e4b0: 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
e4c0: 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
e4d0: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
e4e0: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
e4f0: 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
e500: 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
e510: 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
e520: 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
e530: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
e540: 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
e550: 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
e560: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
e570: 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
e580: 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
e590: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
e5a0: 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
e5b0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e5c0: 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  Tab){.#ifdef SQL
e5d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e5e0: 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  UUM.  Index *pId
e5f0: 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  x;.  int iDb = s
e600: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
e610: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
e620: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
e630: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
e640: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
e650: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f  tnum, iDb);.  fo
e660: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e670: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e680: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e690: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
e6a0: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
e6b0: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  tnum, iDb);.  }.
e6c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68  #else.  /* If th
e6d0: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
e6e0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
e6f0: 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
e700: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e710: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
e720: 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
e730: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
e740: 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
e750: 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
e760: 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
e770: 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
e780: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
e790: 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
e7a0: 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
e7b0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
e7c0: 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
e7d0: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
e7e0: 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
e7f0: 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
e800: 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
e810: 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
e820: 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
e830: 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
e840: 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
e850: 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
e860: 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
e870: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
e880: 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
e890: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
e8a0: 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
e8b0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
e8c0: 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
e8d0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
e8e0: 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
e8f0: 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
e900: 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
e910: 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
e920: 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
e930: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
e940: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
e950: 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
e960: 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
e970: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
e980: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
e990: 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
e9a0: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
e9b0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
e9c0: 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
e9d0: 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
e9e0: 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
e9f0: 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
ea00: 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
ea10: 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
ea20: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
ea30: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
ea40: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ea50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
ea60: 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
ea70: 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
ea80: 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
ea90: 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
eaa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
eab0: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
eac0: 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
ead0: 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
eae0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
eaf0: 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
eb00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
eb10: 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
eb20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
eb30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eb40: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
eb50: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
eb60: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
eb70: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
eb80: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
eb90: 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
eba0: 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
ebb0: 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
ebc0: 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
ebd0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ebe0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ebf0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
ec00: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
ec10: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
ec20: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
ec30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
ec40: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
ec50: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
ec60: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
ec70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
ec80: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
ec90: 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
eca0: 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
ecb0: 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
ecc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ecd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
ece0: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
ecf0: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
ed00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ed10: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ed20: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
ed30: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
ed40: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61  nSrc==1 );.  pTa
ed50: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
ed60: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
ed70: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
ed80: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
ed90: 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28  atabase);..  if(
eda0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
edb0: 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20  if( noErr ){.   
edc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43     sqlite3ErrorC
edd0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
ede0: 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69    }.    goto exi
edf0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ee00: 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
ee10: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
ee20: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
ee30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
ee40: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
ee50: 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Db );.#ifndef SQ
ee60: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
ee70: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
ee80: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
ee90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
eea0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
eeb0: 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
eec0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
eed0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
eee0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
eef0: 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
ef00: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
ef10: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
ef20: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
ef30: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
ef40: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
ef50: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
ef60: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
ef70: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
ef80: 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
ef90: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
efa0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
efb0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
efc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
efd0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
efe0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
eff0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f000: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
f010: 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
f020: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
f030: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f040: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
f050: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
f060: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
f070: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f090: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f0a0: 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
f0b0: 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e 70   zArg2 = pTab->p
f0c0: 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64  Mod->zName;.#end
f0d0: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
f0e0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
f0f0: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
f100: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
f110: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
f120: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
f130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
f140: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
f150: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
f160: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
f170: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f180: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
f190: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c  b->zName, zArg2,
f1a0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f1b0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f1c0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
f1d0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f1e0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f1f0: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
f200: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
f210: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
f220: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f230: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f240: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
f250: 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62  Only || pTab==db
f260: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
f270: 6d 61 2d 3e 70 53 65 71 54 61 62 20 29 7b 0a 20  ma->pSeqTab ){. 
f280: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f290: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
f2a0: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
f2b0: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
f2c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
f2d0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f2e0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
f2f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
f300: 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
f310: 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
f320: 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
f330: 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
f340: 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
f350: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
f360: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
f370: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
f380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f390: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
f3a0: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
f3b0: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
f3c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f3d0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f3e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
f3f0: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
f400: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
f410: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f420: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
f430: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
f440: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
f450: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f460: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f470: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
f480: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
f490: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
f4a0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
f4b0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f4c0: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
f4d0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
f4e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f4f0: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
f500: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
f510: 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  er;.    Db *pDb 
f520: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
f530: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
f540: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f550: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
f560: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f570: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f580: 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
f590: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
f5a0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
f5b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f5c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
f5d0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  v ){.        sql
f5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f5f0: 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30   OP_VBegin, 0, 0
f600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f610: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f620: 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
f630: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
f640: 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
f650: 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
f660: 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
f670: 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
f680: 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
f690: 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
f6a0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
f6b0: 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
f6c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
f6d0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
f6e0: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
f6f0: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
f700: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f710: 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
f720: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
f730: 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ma || .         
f740: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
f750: 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
f760: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
f770: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
f780: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
f790: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70  rigger);.      p
f7a0: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
f7b0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
f7c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f7d0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
f7e0: 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
f7f0: 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
f800: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
f810: 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
f820: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
f830: 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
f840: 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
f850: 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
f860: 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
f870: 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  ped.    ** at th
f880: 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
f890: 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
f8a0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
f8b0: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
f8c0: 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
f8d0: 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
f8e0: 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
f8f0: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
f900: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f910: 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  Tab->autoInc ){.
f920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
f930: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
f940: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
f950: 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f   FROM %s.sqlite_
f960: 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e  sequence WHERE n
f970: 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
f980: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
f990: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
f9a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
f9b0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
f9c0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
f9d0: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
f9e0: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
f9f0: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   to the.    ** t
fa00: 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
fa10: 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
fa20: 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
fa30: 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
fa40: 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  s.    ** every r
fa50: 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
fa60: 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
fa70: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
fa80: 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20  e one being.    
fa90: 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
faa0: 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
fab0: 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61   seperately beca
fac0: 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
fad0: 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  n be.    ** crea
fae0: 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
faf0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
fb00: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
fb10: 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  in another.    *
fb20: 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
fb30: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
fb40: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
fb50: 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  , .        "DELE
fb60: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
fb70: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
fb80: 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
fb90: 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44  er'",.        pD
fba0: 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
fbb0: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
fbc0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
fbd0: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
fbe0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
fbf0: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
fc00: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
fc10: 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
fc20: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
fc30: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
fc40: 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
fc50: 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
fc60: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
fc70: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
fc80: 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  */.    if( IsVir
fc90: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
fca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
fcb0: 70 33 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p3(v, OP_VDestro
fcc0: 79 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d  y, iDb, 0, pTab-
fcd0: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
fce0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
fcf0: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
fd00: 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54  able, iDb, 0, pT
fd10: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
fd20: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
fd30: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
fd40: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
fd50: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
fd60: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
fd70: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
fd80: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
fd90: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
fda0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fdb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
fdc0: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
fdd0: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
fde0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
fdf0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
fe00: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
fe10: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
fe20: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
fe30: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
fe40: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
fe50: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
fe60: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
fe70: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
fe80: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
fe90: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
fea0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
feb0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
fec0: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
fed0: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
fee0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
fef0: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
ff00: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
ff10: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
ff20: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
ff30: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
ff40: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
ff50: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
ff60: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
ff70: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
ff80: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
ff90: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
ffa0: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
ffb0: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
ffc0: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
ffd0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
ffe0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
fff0: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
10000 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
10010 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
10020 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
10030 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
10040 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
10050 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
10060 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
10070 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
10080 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
10090 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
100a0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
100b0 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
100c0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
100d0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
100e0 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
100f0 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
10100 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
10110 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
10120 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
10130 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
10140 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10150 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
10160 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
10170 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
10180 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
10190 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
101a0 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
101b0 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
101c0 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
101d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
101e0 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
101f0 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
10200 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
10210 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
10220 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
10230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10240 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
10250 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
10260 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
10270 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
10280 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
10290 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  ey = 0;.  Table 
102a0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
102b0 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
102c0 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
102d0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
102e0 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
102f0 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
10300 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
10310 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  nErr || IN_DECLA
10320 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
10330 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
10340 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
10350 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
10360 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
10370 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
10380 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
10390 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
103a0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
103b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
103c0 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
103d0 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
103e0 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
103f0 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
10400 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
10410 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
10420 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
10430 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
10440 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
10450 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
10460 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
10470 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
10480 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
10490 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
104a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
104b0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
104c0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
104d0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
104e0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
104f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
10500 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
10510 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
10520 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
10530 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
10540 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
10550 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
10560 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
10570 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e  zeof(*pFKey) + n
10580 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  Col*sizeof(pFKey
10590 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
105a0 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
105b0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
105c0 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
105d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
105e0 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
105f0 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
10600 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
10610 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
10620 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
10630 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
10640 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
10650 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
10660 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
10670 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
10680 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
10690 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
106a0 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
106b0 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
106c0 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
106d0 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
106e0 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
106f0 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
10700 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
10710 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
10720 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
10730 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
10740 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
10750 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
10760 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
10770 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
10780 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
10790 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
107a0 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
107b0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
107c0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
107d0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
107e0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
107f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
10800 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
10810 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
10820 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
10830 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
10840 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
10850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10860 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
10870 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
10880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10890 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
108a0 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
108b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
108c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
108d0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
108e0 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
108f0 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
10900 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
10910 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
10920 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
10930 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
10940 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
10950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10960 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
10970 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
10980 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
10990 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f  n = strlen(pToCo
109a0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
109b0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
109c0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
109d0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
109e0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
109f0 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
10a00 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
10a10 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
10a20 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
10a30 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
10a40 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
10a50 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20  flags & 0xff;.  
10a60 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
10a70 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20  f = (flags >> 8 
10a80 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  ) & 0xff;.  pFKe
10a90 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
10aa0 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
10ab0 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e   0xff;..  /* Lin
10ac0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
10ad0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
10ae0 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
10af0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
10b00 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
10b10 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
10b20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10b30 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
10b40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10b50 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
10b60 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
10b70 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46  xprListDelete(pF
10b80 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
10b90 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
10ba0 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (pToCol);.}../*.
10bb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10bc0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
10bd0 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
10be0 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
10bf0 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
10c00 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
10c10 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
10c20 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
10c30 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
10c40 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
10c50 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
10c60 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
10c70 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
10c80 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
10c90 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
10ca0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
10cb0 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
10cc0 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
10cd0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
10ce0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
10cf0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
10d00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
10d10 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
10d20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10d30 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
10d40 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
10d50 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
10d60 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
10d70 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
10d80 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
10d90 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
10da0 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
10db0 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
10dc0 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
10dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
10de0 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
10df0 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
10e00 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
10e10 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
10e20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
10e30 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
10e40 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
10e50 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
10e60 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
10e70 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
10e80 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
10e90 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
10ea0 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
10eb0 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
10ec0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
10ed0 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
10ee0 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ed.  The memory 
10ef0 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62  cell specified b
10f00 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
10f10 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
10f20 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
10f30 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
10f40 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
10f50 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
10f60 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
10f70 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
10f80 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
10f90 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
10fa0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
10fb0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
10fc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
10fd0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
10fe0 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
10ff0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11000 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
11010 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
11020 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
11030 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
11040 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
11050 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
11060 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
11070 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
11080 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
11090 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  ->nTab;       /*
110a0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
110b0 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
110c0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
110d0 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20  se->nTab+1;     
110e0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
110f0 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
11100 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11130 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
11140 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
11170 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
11180 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
11190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
111a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
111b0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
111c0 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
111d0 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
111e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
111f0 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
11200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11210 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11220 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11230 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
11240 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
11250 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11260 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
11270 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
11280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11290 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
112a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
112b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
112c0 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
112d0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
112e0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
112f0 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
11300 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
11310 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
11320 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
11330 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
11340 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
11350 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
11360 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
11370 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
11380 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
11390 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
113a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
113b0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
113c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
113d0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
113e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
113f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
11400 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c  ad, memRootPage,
11410 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20   0);.    tnum = 
11420 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11430 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
11440 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
11450 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11460 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
11470 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11480 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11490 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
114a0 3b 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  ;.  pKey = sqlit
114b0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
114c0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
114d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
114e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
114f0 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63  , iIdx, tnum, (c
11500 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b  har *)pKey, P3_K
11510 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
11520 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
11530 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
11540 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
11550 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
11560 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
11570 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
11580 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
11590 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
115a0 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
115b0 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20  x, iTab);.  if( 
115c0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
115d0 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
115e0 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71  int curaddr = sq
115f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11600 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74  Addr(v);.    int
11610 20 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72   addr2 = curaddr
11620 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +4;.    sqlite3V
11630 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63  dbeChangeP2(v, c
11640 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29  uraddr-1, addr2)
11650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11660 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
11670 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  id, iTab, 0);.  
11680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11690 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
116a0 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
116b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
116c0 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64  OP_IsUnique, iId
116d0 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  x, addr2);.    s
116e0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
116f0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
11700 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f  _CONSTRAINT, OE_
11710 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Abort,.         
11720 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65             "inde
11730 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
11740 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
11750 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73  STATIC);.    ass
11760 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
11770 61 69 6c 65 64 20 7c 7c 20 61 64 64 72 32 3d 3d  ailed || addr2==
11780 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11790 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d  ntAddr(v) );.  }
117a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
117b0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
117c0 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ert, iIdx, 0);. 
117d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
117e0 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
117f0 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
11800 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11810 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
11820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11830 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
11840 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
11850 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11860 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
11870 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
11880 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
11890 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
118a0 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
118b0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
118c0 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
118d0 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
118e0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
118f0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
11900 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
11910 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
11920 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
11930 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
11940 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
11950 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
11960 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
11970 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
11980 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
11990 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
119a0 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
119b0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
119c0 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
119d0 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
119e0 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
119f0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
11a00 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
11a10 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
11a20 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
11a30 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
11a40 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
11a50 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
11a60 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
11a70 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
11a80 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
11a90 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
11aa0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11ab0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
11ac0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
11ad0 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
11ae0 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
11af0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
11b00 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
11b10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
11b20 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
11b30 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
11b40 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
11b50 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
11b60 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
11b70 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
11b80 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
11b90 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
11ba0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
11bb0 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
11bc0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
11bd0 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
11be0 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
11bf0 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
11c00 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
11c10 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
11c20 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
11c30 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
11c40 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11c50 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
11c60 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
11c70 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
11c80 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
11c90 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
11ca0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
11cb0 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
11cc0 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
11cd0 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
11ce0 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
11cf0 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
11d00 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
11d10 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
11d20 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
11d30 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
11d40 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
11d50 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
11d60 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
11d70 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
11d80 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
11d90 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
11da0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
11db0 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
11dc0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
11dd0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
11de0 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
11df0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
11e00 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
11e10 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
11e20 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
11e30 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
11e40 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
11e50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11e60 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
11e70 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
11e80 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
11e90 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
11ea0 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
11eb0 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
11ec0 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
11ed0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
11ee0 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
11ef0 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
11f00 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
11f10 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
11f20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
11f30 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
11f40 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
11f50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11f60 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
11f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11f80 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
11f90 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
11fa0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
11fb0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
11fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11fd0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
11fe0 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
11ff0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
12000 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
12010 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
12020 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
12030 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
12040 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
12050 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
12060 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
12070 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
12080 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
12090 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
120a0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
120b0 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  a;..  if( pParse
120c0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
120d0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
120e0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
120f0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
12100 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
12110 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
12120 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
12130 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
12140 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
12150 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
12160 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
12170 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
12180 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
12190 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
121a0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
121b0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
121c0 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
121d0 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
121e0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
121f0 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
12200 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
12210 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
12220 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
12230 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
12240 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
12250 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
12260 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
12270 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
12280 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
12290 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
122a0 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66  _index;..#ifndef
122b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
122c0 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
122d0 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
122e0 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
122f0 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
12300 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
12310 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
12320 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
12330 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a  base to 1..    *
12340 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  /.    pTab = sql
12350 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
12360 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
12370 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61  me);.    if( pNa
12380 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
12390 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
123a0 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
123b0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
123c0 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20   ){.      iDb = 
123d0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
123e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
123f0 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
12400 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64  Parse, iDb, "ind
12410 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20  ex", pName) &&. 
12420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69         sqlite3Fi
12430 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
12440 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b  pTblName).    ){
12450 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
12460 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
12470 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
12480 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
12490 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
124a0 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
124b0 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
124c0 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
124d0 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
124e0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
124f0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
12500 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e  arse, pTblName->
12510 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  a[0].zName, .   
12520 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61       pTblName->a
12530 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
12540 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
12550 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12560 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
12570 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
12580 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  .pSchema==pTab->
12590 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c  pSchema );.  }el
125a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
125b0 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
125c0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
125d0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
125e0 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
125f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12600 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
12610 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12620 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
12630 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
12640 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
12650 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
12660 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
12670 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12680 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70  e_index;.  if( p
12690 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
126a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
126b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
126c0 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
126d0 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
126e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
126f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12700 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
12710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12720 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
12730 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
12740 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12750 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
12760 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
12770 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
12780 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12790 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
127a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
127b0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
127c0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
127d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
127e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
127f0 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
12800 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
12810 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
12820 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12830 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12840 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
12850 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12860 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
12870 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
12880 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
12890 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
128a0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
128b0 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
128c0 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
128d0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
128e0 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
128f0 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
12900 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
12910 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
12920 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
12930 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
12940 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
12950 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
12960 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
12970 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
12980 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
12990 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
129a0 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
129b0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
129c0 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
129d0 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
129e0 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
129f0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
12a00 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
12a10 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
12a20 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
12a30 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
12a40 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
12a50 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
12a60 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
12a70 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
12a80 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
12a90 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
12aa0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
12ab0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
12ac0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
12ad0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12ae0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
12af0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
12b00 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12b10 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12b20 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
12b30 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
12b40 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
12b50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12b60 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12b70 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
12b80 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
12b90 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
12ba0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
12bb0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
12bc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12bd0 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ex;.      if( sq
12be0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
12bf0 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
12c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12c10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12c20 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
12c30 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
12c40 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
12c50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
12c60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12c80 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
12c90 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
12ca0 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
12cb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
12cc0 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
12cd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12ce0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
12cf0 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
12d00 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
12d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
12d20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12d30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
12d40 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
12d50 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
12d60 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
12d70 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
12d80 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
12d90 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
12da0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
12db0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 71 6c 69   n++){}.    sqli
12dc0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
12dd0 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22  eof(zBuf),zBuf,"
12de0 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61  _%d",n);.    zNa
12df0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
12e00 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
12e10 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
12e20 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e  oindex_", pTab->
12e30 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68  zName, zBuf, (ch
12e40 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20  ar*)0);.    if( 
12e50 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
12e60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12e70 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  x;.  }..  /* Che
12e80 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
12e90 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
12ea0 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
12eb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12ec0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12ed0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
12ee0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
12ef0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
12f00 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12f10 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
12f20 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
12f30 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
12f40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
12f50 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
12f70 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
12f80 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
12f90 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
12fa0 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
12fb0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
12fc0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
12fd0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
12fe0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
12ff0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
13000 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13010 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13030 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
13040 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
13050 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
13060 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
13070 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
13080 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
13090 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
130a0 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
130b0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
130c0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
130d0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
130e0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
130f0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
13100 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
13110 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43   = (u8*)pTab->aC
13120 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
13130 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
13140 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63  Id.n = strlen((c
13150 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
13160 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
13170 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
13180 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  d(0, 0, &nullId)
13190 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
131a0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
131b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
131c0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
131d0 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
131e0 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
131f0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
13200 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
13210 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
13220 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
13230 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
13240 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13250 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
13260 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
13270 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
13280 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
13290 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
132a0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
132b0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  xpr ){.      nEx
132c0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c  tra += (1 + strl
132d0 65 6e 28 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  en(pExpr->pColl-
132e0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
132f0 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
13300 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
13310 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
13320 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74   */.  nName = st
13330 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  rlen(zName);.  n
13340 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
13350 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  pr;.  pIndex = s
13360 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
13370 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69  ro(db, .      si
13380 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20  zeof(Index) +   
13390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
133a0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a  dex structure  *
133b0 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69  /.      sizeof(i
133c0 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  nt)*nCol +      
133d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
133e0 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
133f0 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e    sizeof(int)*(n
13400 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f  Col+1) +       /
13410 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  * Index.aiRowEst
13420 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
13430 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20  of(char *)*nCol 
13440 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  +        /* Inde
13450 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
13460 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
13470 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
13480 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
13490 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20  tOrder */.      
134a0 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  nName + 1 +     
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
134c0 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20  Index.zName     
134d0 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61   */.      nExtra
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
13500 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13510 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  es */.  );.  if(
13520 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13530 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
13540 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13550 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61  .  }.  pIndex->a
13560 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
13570 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20  (&pIndex[1]);.  
13580 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
13590 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64   = (int *)(&pInd
135a0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d  ex->azColl[nCol]
135b0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52  );.  pIndex->aiR
135c0 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
135d0 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  d *)(&pIndex->ai
135e0 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20  Column[nCol]);. 
135f0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
13600 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49  der = (u8 *)(&pI
13610 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e  ndex->aiRowEst[n
13620 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  Col+1]);.  pInde
13630 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
13640 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
13650 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
13660 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
13670 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
13680 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
13690 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
136a0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
136b0 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
136c0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
136d0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
136e0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
136f0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
13700 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
13710 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
13720 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
13730 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
13740 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13750 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
13760 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
13770 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
13780 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
13790 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
137a0 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
137b0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
137c0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
137d0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
137e0 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
137f0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
13800 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
13810 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
13820 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
13830 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
13840 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
13850 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
13860 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
13870 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
13880 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
13890 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
138a0 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
138b0 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
138c0 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
138d0 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
138e0 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
138f0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
13900 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13910 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
13920 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13930 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
13940 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
13950 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
13960 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
13970 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
13980 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
139b0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
139c0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61      for(j=0, pTa
139d0 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
139e0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
139f0 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  ++, pTabCol++){.
13a00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13a10 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d  3StrICmp(zColNam
13a20 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d  e, pTabCol->zNam
13a30 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
13a40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
13a50 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
13a60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13a70 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
13a80 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
13a90 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
13aa0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
13ab0 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20  me, zColName);. 
13ac0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13ad0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13ae0 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20   }.    /* TODO: 
13af0 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
13b00 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
13b10 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
13b20 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a   not named.    *
13b30 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
13b40 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
13b50 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
13b60 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
13b70 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
13b80 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
13b90 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
13ba0 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
13bb0 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
13bc0 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d     ** same colum
13bd0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
13be0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
13bf0 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
13c00 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62   would .    ** b
13c10 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
13c20 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
13c30 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
13c40 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  warning..    */.
13c50 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
13c60 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
13c70 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
13c80 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
13c90 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
13ca0 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ->pExpr->pColl )
13cb0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
13cc0 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 71  zExtra;.      sq
13cd0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
13ce0 45 78 74 72 61 2c 20 7a 45 78 74 72 61 2c 20 22  Extra, zExtra, "
13cf0 25 73 22 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e  %s", pListItem->
13d00 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e  pExpr->pColl->zN
13d10 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78 74  ame);.      zExt
13d20 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43  ra += (strlen(zC
13d30 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  oll) + 1);.    }
13d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
13d50 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
13d60 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
13d70 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !zColl ){.   
13d80 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d       zColl = db-
13d90 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >pDfltColl->zNam
13da0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
13db0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
13dc0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
13dd0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
13de0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20  (pParse, zColl, 
13df0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  -1) ){.      got
13e00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13e10 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
13e20 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
13e30 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
13e40 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
13e50 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
13e60 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
13e70 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
13e80 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
13e90 69 5d 20 3d 20 72 65 71 75 65 73 74 65 64 53 6f  i] = requestedSo
13ea0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73  rtOrder;.  }.  s
13eb0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
13ec0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  Est(pIndex);..  
13ed0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
13ee0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
13ef0 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
13f00 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
13f10 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
13f20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
13f30 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
13f40 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
13f50 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
13f60 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
13f70 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
13f80 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
13f90 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
13fa0 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
13fb0 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
13fc0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
13fd0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
13fe0 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
13ff0 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
14000 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
14010 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
14020 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
14030 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
14040 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
14050 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
14060 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
14070 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
14080 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
14090 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
140a0 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
140b0 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
140c0 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
140d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
140e0 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
140f0 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
14100 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
14110 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
14120 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
14130 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
14140 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
14150 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
14160 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14170 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
14180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14190 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
141a0 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  None );.      as
141b0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f  sert( pIdx->auto
141c0 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61  Index );.      a
141d0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f  ssert( pIndex->o
141e0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
141f0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
14200 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e  dx->nColumn!=pIn
14210 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  dex->nColumn ) c
14220 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
14230 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
14240 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
14250 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
14260 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a  r *z1 = pIdx->az
14270 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
14280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
14290 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
142a0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
142b0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
142c0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
142d0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
142e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
142f0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
14300 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  !=pIndex->aSortO
14310 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  rder[k] ) break;
14320 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21  .        if( z1!
14330 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74  =z2 && sqlite3St
14340 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
14350 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14360 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
14370 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
14380 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
14390 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
143a0 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
143b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
143c0 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
143d0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
143e0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
143f0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
14400 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
14410 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
14420 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
14430 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
14440 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
14450 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
14460 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
14470 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
14480 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
14490 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
144a0 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
144b0 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
144c0 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
144d0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
144e0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
144f0 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
14500 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
14510 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
14520 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
14530 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
14540 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
14550 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
14560 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
14570 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
14580 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
14590 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
145a0 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
145b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
145c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
145e0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
145f0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
14600 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
14610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14620 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14630 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
14640 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
14650 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
14660 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
14670 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
14680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14690 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
146a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
146b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
146c0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
146d0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
146e0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
146f0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
14700 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
14710 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
14720 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
14730 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
14740 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
14750 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
14760 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
14770 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
14780 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14790 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
147a0 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
147b0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
147c0 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
147d0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
147e0 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
147f0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
14800 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
14810 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
14820 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
14830 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14840 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14850 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
14860 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
14870 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
14880 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
14890 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
148a0 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
148b0 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
148c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
148d0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
148e0 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
148f0 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
14900 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
14910 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
14920 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
14930 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
14940 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
14950 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
14960 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
14970 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
14980 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
14990 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
149a0 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
149b0 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
149c0 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
149d0 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
149e0 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
149f0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
14a00 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
14a10 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
14a20 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
14a30 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
14a40 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
14a50 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
14a60 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
14a70 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
14a80 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
14a90 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
14aa0 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
14ab0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
14ac0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
14ad0 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
14ae0 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
14af0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
14b00 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
14b10 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
14b20 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
14b30 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
14b40 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
14b50 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
14b60 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
14b70 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
14b80 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
14b90 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
14ba0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
14bb0 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
14bc0 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
14bd0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
14be0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
14bf0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
14c00 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20  arse->nMem++;.. 
14c10 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
14c20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14c30 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
14c40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14c50 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
14c60 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
14c70 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
14c80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
14c90 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
14ca0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
14cb0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
14cc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14cd0 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
14ce0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
14cf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14d00 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
14d10 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  em, 0);..    /* 
14d20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
14d30 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
14d40 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
14d50 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
14d60 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
14d70 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
14d80 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70   if( pStart && p
14d90 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  End ){.      /* 
14da0 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
14db0 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
14dc0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
14dd0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
14de0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
14df0 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20  rintf("CREATE%s 
14e00 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
14e10 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
14e20 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
14e30 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20  NIQUE",.        
14e40 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d  pEnd->z - pName-
14e50 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20  >z + 1,.        
14e60 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
14e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
14e80 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
14e90 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
14ea0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
14eb0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
14ec0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
14ed0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
14ee0 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
14ef0 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
14f00 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
14f10 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
14f20 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
14f30 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
14f40 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14f50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
14f60 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
14f70 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
14f80 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30  'index',%Q,%Q,#0
14f90 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
14fa0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
14fb0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
14fc0 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
14fd0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
14fe0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
14ff0 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  e,.        zStmt
15000 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
15010 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15020 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
15030 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15040 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
15050 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
15060 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
15070 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
15080 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
15090 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
150a0 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
150b0 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
150c0 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
150d0 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
150e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
150f0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
15100 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
15110 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
15120 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
15130 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
15140 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
15150 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
15160 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Db, 0,.         
15170 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
15180 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64  name='%q'", pInd
15190 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ex->zName), P3_D
151a0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73  YNAMIC);.      s
151b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
151c0 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
151d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
151e0 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
151f0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
15200 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
15210 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
15220 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
15230 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
15240 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
15250 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
15260 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
15270 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
15280 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
15290 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
152a0 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
152b0 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
152c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
152d0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
152e0 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
152f0 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
15300 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
15310 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
15320 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
15330 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
15340 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
15350 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
15360 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
15370 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
15380 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
15390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
153a0 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
153b0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
153c0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
153d0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
153e0 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
153f0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
15400 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
15410 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
15420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
15430 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
15440 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
15450 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
15460 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
15470 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
15480 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
15490 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
154a0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
154b0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
154c0 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65  ndex ){.    free
154d0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
154e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
154f0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
15500 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
15510 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
15520 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  me);.  sqlite3_f
15530 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  ree(zName);.  re
15540 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  turn;.}../*.** G
15550 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
15560 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69  make sure the fi
15570 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72  le format number
15580 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e   is at least min
15590 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67  Format..** The g
155a0 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77 69  enerated code wi
155b0 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ll increase the 
155c0 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62  file format numb
155d0 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  er if necessary.
155e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
155f0 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61  MinimumFileForma
15600 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
15610 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69   int iDb, int mi
15620 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65  nFormat){.  Vdbe
15630 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74   *v;.  v = sqlit
15640 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
15650 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
15660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15670 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
15680 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
15690 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
156a0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
156b0 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b  , minFormat, 0);
156c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
156d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20  AddOp(v, OP_Ge, 
156e0 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
156f0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
15700 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15710 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
15720 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20  ger, minFormat, 
15730 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
15740 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
15750 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  etCookie, iDb, 1
15760 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15770 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
15780 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
15790 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
157a0 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
157b0 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
157c0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
157d0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
157e0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
157f0 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
15800 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63   is suppose to c
15810 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
15820 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
15830 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
15840 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
15850 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
15860 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
15870 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
15880 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
15890 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
158a0 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
158b0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
158c0 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
158d0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
158e0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
158f0 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
15900 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
15910 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
15920 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
15930 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
15940 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  iniation of the 
15950 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
15960 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
15970 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
15980 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
15990 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
159a0 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
159b0 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
159c0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
159d0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
159e0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
159f0 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
15a00 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
15a10 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
15a20 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
15a30 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
15a40 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
15a50 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
15a60 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
15a70 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
15a80 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
15a90 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
15aa0 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
15ab0 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
15ac0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
15ad0 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
15ae0 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
15af0 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
15b00 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b   assert( a!=0 );
15b10 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30  .  a[0] = 100000
15b20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d  0;.  for(i=pIdx-
15b30 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20  >nColumn; i>=5; 
15b40 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i--){.    a[i] =
15b50 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   5;.  }.  while(
15b60 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69   i>=1 ){.    a[i
15b70 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20  ] = 11 - i;.    
15b80 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  i--;.  }.  if( p
15b90 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
15ba0 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70  _None ){.    a[p
15bb0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20  Idx->nColumn] = 
15bc0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
15bd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
15be0 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
15bf0 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
15c00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
15c10 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
15c20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
15c30 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
15c40 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
15c50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
15c60 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
15c70 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
15c80 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
15c90 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
15ca0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15cb0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
15cc0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15cd0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
15ce0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15cf0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
15d00 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
15d10 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
15d20 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
15d30 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
15d40 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
15d50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
15d60 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
15d70 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
15d80 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
15d90 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
15da0 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
15db0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
15dc0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
15dd0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
15de0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15df0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15e00 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
15e10 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
15e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
15e30 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
15e40 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
15e50 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15e60 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
15e70 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
15e80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15e90 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
15ea0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15eb0 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
15ec0 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
15ed0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
15ee0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
15ef0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
15f00 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
15f10 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
15f20 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
15f30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
15f40 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
15f50 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
15f60 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
15f70 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
15f80 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
15f90 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
15fa0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
15fb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
15fc0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
15fd0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
15fe0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
15ff0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
16000 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16010 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16020 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
16030 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
16040 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
16050 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
16070 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
16080 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
16090 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
160a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
160b0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
160c0 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
160d0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
160e0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
160f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16100 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
16110 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16120 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16130 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
16140 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
16150 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
16160 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16170 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16180 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
16190 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
161a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
161b0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
161c0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
161d0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
161e0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
161f0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
16200 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
16210 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
16220 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
16230 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
16240 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
16250 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
16260 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
16270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
16280 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
16290 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64  ex, iDb, 0, pInd
162a0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
162b0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
162c0 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
162d0 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
162e0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
162f0 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
16300 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
16310 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f  objects.  Each o
16320 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
16330 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
16340 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
16350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
16360 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
16370 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65   object on the e
16380 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  nd of the array.
16390 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20  .**.** *pnEntry 
163a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
163b0 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79   entries already
163c0 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c   in use.  *pnAll
163d0 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65  oc is.** the pre
163e0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
163f0 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  d size of the ar
16400 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69  ray.  initSize i
16410 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74  s the.** suggest
16420 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79  ed initial array
16430 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   size allocation
16440 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
16450 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  x of the new ent
16460 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ry is returned i
16470 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  n *pIdx..**.** T
16480 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
16490 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
164a0 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62   the array of ob
164b0 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20  jects.  This.** 
164c0 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
164d0 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20  e as the pArray 
164e0 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20  parameter or it 
164f0 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65  might be a diffe
16500 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rent.** pointer 
16510 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73  if the array was
16520 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69   resized..*/.voi
16530 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
16540 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
16550 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
16560 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
16570 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
16580 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
16590 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
165a0 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
165b0 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
165c0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
165d0 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
165e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
165f0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
16600 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rray */.  int in
16610 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53  itSize,     /* S
16620 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
16630 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
16640 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
16650 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
16660 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
16670 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
16680 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
16690 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20  pnAlloc,     /* 
166a0 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
166b0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
166c0 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
166d0 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
166e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
166f0 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
16700 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
16710 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
16720 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41  *pnEntry >= *pnA
16730 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64  lloc ){.    void
16740 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
16750 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
16760 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63  Size = (*pnAlloc
16770 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  )*2 + initSize;.
16780 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
16790 65 33 5f 72 65 61 6c 6c 6f 63 28 70 41 72 72 61  e3_realloc(pArra
167a0 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
167b0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
167c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62  w==0 ){.      db
167d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
167e0 20 31 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   1;.      *pIdx 
167f0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
16800 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
16810 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20  .    *pnAlloc = 
16820 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 41 72  newSize;.    pAr
16830 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
16840 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
16850 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
16860 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e  [*pnEntry * szEn
16870 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79  try], 0, szEntry
16880 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e  );.  *pIdx = *pn
16890 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  Entry;.  ++*pnEn
168a0 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
168b0 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
168c0 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
168d0 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
168e0 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
168f0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
16900 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
16910 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
16920 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
16930 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
16940 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
16950 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
16960 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
16970 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
16980 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
16990 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
169a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
169b0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
169c0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
169d0 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
169e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
169f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
16a00 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
16a10 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  oc = 0;.  }.  pL
16a20 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
16a30 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
16a40 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
16a50 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
16a60 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
16a70 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20  ]),.      5,.   
16a80 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
16a90 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41        &pList->nA
16aa0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20  lloc,.      &i. 
16ab0 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b   );.  if( i<0 ){
16ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
16ad0 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
16ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16af0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
16b00 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
16b10 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
16b20 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  , pToken);.  ret
16b30 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
16b40 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
16b50 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
16b60 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
16b70 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
16b80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
16b90 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16ba0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
16bb0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
16bc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
16bd0 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
16be0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
16bf0 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74  lite3_free(pList
16c00 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ->a);.  sqlite3_
16c10 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  free(pList);.}..
16c20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16c30 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
16c40 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
16c50 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
16c60 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
16c70 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
16c80 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
16c90 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
16ca0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
16cb0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
16cc0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16cd0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
16ce0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
16cf0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
16d00 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
16d10 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
16d20 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
16d30 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
16d40 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
16d50 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
16d60 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
16d70 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
16d80 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
16d90 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
16da0 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
16db0 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
16dc0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
16dd0 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
16de0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
16df0 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
16e00 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
16e10 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
16e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
16e30 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
16e40 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
16e50 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
16e60 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
16e70 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
16e80 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
16e90 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
16ea0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
16eb0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
16ec0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
16ed0 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
16ee0 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
16ef0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
16f00 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
16f10 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
16f20 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
16f30 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
16f40 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
16f50 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
16f60 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
16f70 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
16f80 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
16f90 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
16fa0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
16fb0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
16fc0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
16fd0 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
16fe0 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
16ff0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
17000 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
17010 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
17020 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
17030 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
17040 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
17050 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
17060 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
17070 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
17080 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
17090 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
170a0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
170b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
170c0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
170d0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
170e0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
170f0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
17100 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
17110 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
17120 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
17130 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
17140 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
17150 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
17160 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
17170 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
17180 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
17190 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
171a0 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
171b0 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
171c0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
171d0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
171e0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
171f0 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
17200 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
17210 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
17220 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
17230 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
17240 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
17250 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
17260 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
17270 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
17280 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
17290 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
172a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
172b0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
172c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
172d0 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
172e0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
172f0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
17300 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
17310 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
17320 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
17330 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
17340 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69       sizeof(*pLi
17350 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41  st) + (pList->nA
17360 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
17370 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
17380 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
17390 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
173a0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
173b0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
173c0 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
173d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
173e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
173f0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = pNew;.  }.  p
17400 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
17410 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20  [pList->nSrc];. 
17420 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
17430 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  , sizeof(pList->
17440 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44  a[0]));.  if( pD
17450 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
17460 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
17470 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
17480 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
17490 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20 29  base && pTable )
174a0 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
174b0 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
174c0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
174d0 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
174e0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
174f0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
17500 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17510 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
17520 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
17530 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
17540 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
17550 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70   pDatabase);.  p
17560 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
17570 2d 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50  -1;.  pItem->isP
17580 6f 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20  opulated = 0;.  
17590 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
175a0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
175b0 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
175c0 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
175d0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
175e0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
175f0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
17600 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
17610 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
17620 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
17630 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
17640 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
17650 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
17660 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17670 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
17680 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
17690 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
176a0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
176b0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
176c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
176d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
176e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
176f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
17700 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17710 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
17720 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
17730 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
17740 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
17750 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
17760 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
17770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17780 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
17790 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
177a0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
177b0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
177c0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
177d0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
177e0 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29  (SrcList *pList)
177f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
17800 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17810 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
17820 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17830 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
17840 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
17850 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
17860 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
17870 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
17880 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
17890 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
178a0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
178b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
178c0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
178d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
178e0 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54  eTable(pItem->pT
178f0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
17900 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74  SelectDelete(pIt
17910 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
17920 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17930 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  ete(pItem->pOn);
17940 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
17950 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  stDelete(pItem->
17960 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
17970 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
17980 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
17990 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
179a0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
179b0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
179c0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
179d0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
179e0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
179f0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
17a00 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
17a10 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17a20 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
17a30 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
17a40 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
17a50 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
17a60 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
17a70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17a80 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
17a90 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
17aa0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
17ab0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
17ac0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
17ad0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
17ae0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
17af0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
17b00 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
17b10 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
17b20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
17b30 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
17b40 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
17b50 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
17b60 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
17b70 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
17b80 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
17b90 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
17ba0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
17bb0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
17bc0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
17bd0 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
17be0 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
17bf0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
17c00 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
17c10 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
17c20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
17c30 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
17c40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
17c50 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
17c60 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
17c70 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
17c80 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
17c90 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
17ca0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
17cb0 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
17cc0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
17cd0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
17ce0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
17cf0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
17d00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
17d10 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
17d20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
17d30 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
17d40 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17d50 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
17d60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
17d70 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
17d80 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
17d90 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
17da0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
17db0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
17dc0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
17dd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17de0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
17df0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
17e00 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
17e10 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
17e20 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
17e30 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
17e40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
17e50 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
17e60 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
17e70 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
17e80 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
17e90 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
17ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
17eb0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
17ec0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
17ed0 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
17ee0 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
17ef0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
17f00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17f10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17f20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17f30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
17f40 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
17f50 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
17f60 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
17f70 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
17f80 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
17f90 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
17fa0 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  te(pOn);.    sql
17fb0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
17fc0 28 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71  (pUsing);.    sq
17fd0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17fe0 65 28 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  e(pSubquery);.  
17ff0 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a    return p;.  }.
18000 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
18010 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  p->nSrc-1];.  if
18020 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69  ( pAlias && pAli
18030 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
18040 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
18050 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
18060 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
18070 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
18080 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
18090 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
180a0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
180b0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
180c0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
180d0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
180e0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
180f0 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
18100 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
18110 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
18120 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
18130 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
18140 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
18150 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
18160 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
18170 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
18180 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
18190 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
181a0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
181b0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
181c0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
181d0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
181e0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
181f0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
18200 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
18210 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
18220 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
18230 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
18240 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
18250 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
18260 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
18270 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
18280 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
18290 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
182a0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
182b0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
182c0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
182d0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
182e0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
182f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
18300 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
18310 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
18320 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
18330 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
18340 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
18350 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b  if( p && p->a ){
18360 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18370 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
18380 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
18390 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
183a0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
183b0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
183c0 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
183d0 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
183e0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
183f0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
18400 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
18410 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
18420 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
18430 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
18440 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
18450 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
18460 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
18470 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
18480 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
18490 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
184a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
184b0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
184c0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
184d0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
184e0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
184f0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
18500 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
18510 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
18520 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18530 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
18540 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
18550 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
18560 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
18570 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
18580 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
18590 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
185a0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
185b0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
185c0 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d  USIVE)+1);.    }
185d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
185e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
185f0 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
18600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
18610 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
18620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
18630 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
18640 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18650 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18660 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
18670 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
18680 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
18690 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
186a0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
186b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
186c0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
186d0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
186e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
186f0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18700 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
18710 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
18720 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
18730 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18740 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18750 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
18760 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18770 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
18780 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
18790 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
187a0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
187b0 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
187c0 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
187d0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
187e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
187f0 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
18800 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
18810 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
18820 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
18830 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
18840 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
18850 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18860 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
18870 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18880 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
18890 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
188a0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
188b0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
188c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
188d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
188e0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
188f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18900 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
18910 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
18920 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
18930 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
18940 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
18950 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
18960 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
18970 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
18980 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
18990 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
189a0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
189b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
189c0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
189d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
189e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
189f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
18a00 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
18a10 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
18a20 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
18a30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
18a40 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
18a50 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46  0, 0, SQLITE_DEF
18a60 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c  AULT_CACHE_SIZE,
18a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a90 20 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42    &db->aDb[1].pB
18aa0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
18ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ac0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18ad0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
18ae0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
18af0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
18b00 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
18b10 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
18b20 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
18b30 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
18b40 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
18b50 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
18b60 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
18b70 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
18b80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
18b90 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
18ba0 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d  Trans(db->aDb[1]
18bb0 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  .pBt, 1);.      
18bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18bd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
18be0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18bf0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
18c00 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  get a write lock
18c10 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   on ".          
18c20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64  "the temporary d
18c30 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a  atabase file");.
18c40 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
18c50 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
18c60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
18c70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
18c80 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
18c90 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20  pSchema );.  }. 
18ca0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18cb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
18cc0 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
18cd0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
18ce0 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
18cf0 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
18d00 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
18d10 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
18d20 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
18d30 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
18d40 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
18d50 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
18d60 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
18d70 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
18d80 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
18d90 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
18da0 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
18db0 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
18dc0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
18dd0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
18de0 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
18df0 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
18e00 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
18e10 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
18e20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
18e30 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
18e40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
18e50 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
18e60 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
18e70 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
18e80 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
18e90 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
18ea0 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
18eb0 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
18ec0 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
18ed0 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
18ee0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
18ef0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
18f00 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
18f10 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
18f20 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
18f30 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
18f40 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
18f50 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
18f60 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
18f70 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
18f80 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
18f90 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
18fa0 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
18fb0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
18fc0 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
18fd0 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
18fe0 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
18ff0 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
19000 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
19010 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
19020 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
19030 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
19040 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
19050 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
19060 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
19070 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
19080 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
19090 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
190a0 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
190b0 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
190c0 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
190d0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
190e0 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
190f0 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
19100 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
19110 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
19120 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
19130 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
19140 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
19150 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
19160 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
19170 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71   mask;..  v = sq
19180 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
19190 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
191a0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
191b0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
191c0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20   if there was a 
191d0 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  prior error */. 
191e0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
191f0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
19200 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b  cookieGoto==0 ){
19210 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  .    pParse->coo
19220 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  kieGoto = sqlite
19230 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19240 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a  _Goto, 0, 0)+1;.
19250 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30    }.  if( iDb>=0
19260 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19270 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
19280 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
19290 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
192a0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  | iDb==1 );.    
192b0 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
192c0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
192d0 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  2 );.    mask = 
192e0 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20  1<<iDb;.    if( 
192f0 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d  (pParse->cookieM
19300 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
19310 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
19320 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
19330 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  sk;.      pParse
19340 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
19350 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  b] = db->aDb[iDb
19360 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
19370 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20  a_cookie;.      
19380 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
19390 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
193a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
193b0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50  nTempDatabase(pP
193c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
193d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
193e0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
193f0 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
19400 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
19410 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
19420 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
19430 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
19440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19450 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
19460 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
19470 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
19480 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
19490 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
194a0 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
194b0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
194c0 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
194d0 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
194e0 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
194f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
19500 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
19510 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
19520 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
19530 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
19540 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
19550 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
19560 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
19570 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
19580 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
19590 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
195a0 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
195b0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
195c0 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
195d0 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
195e0 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
195f0 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
19600 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
19610 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
19620 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
19630 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
19640 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
19650 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
19660 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
19670 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
19680 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
19690 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
196a0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
196b0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
196c0 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
196d0 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
196e0 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
196f0 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
19700 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
19710 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
19720 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
19730 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
19740 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
19750 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
19760 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
19770 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
19780 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
19790 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
197a0 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
197b0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
197c0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
197d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
197e0 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
197f0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
19800 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
19810 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
19820 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
19830 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
19840 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
19850 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
19860 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
19870 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
19880 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26   setStatement &&
19890 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
198a0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
198b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
198c0 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c  _Statement, iDb,
198d0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   0);.  }.  if( (
198e0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
198f0 44 62 21 3d 31 29 20 26 26 20 70 50 61 72 73 65  Db!=1) && pParse
19900 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ->db->aDb[1].pBt
19910 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
19920 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
19930 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
19940 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
19950 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
19960 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
19970 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
19980 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
19990 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
199a0 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
199b0 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
199c0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
199d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
199e0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
199f0 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
19a00 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
19a10 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
19a20 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
19a30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
19a40 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
19a50 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
19a60 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
19a70 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
19a80 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20  if( z==zColl || 
19a90 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30  (z && zColl && 0
19aa0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
19ab0 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20  (z, zColl)) ){. 
19ac0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19ad0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19ae0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
19af0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
19b00 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
19b10 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
19b20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19b30 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
19b40 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
19b50 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
19b60 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
19b70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19b80 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
19b90 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
19ba0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
19bb0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
19bc0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
19bd0 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
19be0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
19bf0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
19c00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
19c10 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
19c20 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
19c30 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
19c40 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
19c50 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
19c60 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
19c70 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
19c80 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
19c90 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
19ca0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
19cb0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
19cc0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
19cd0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
19ce0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
19cf0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
19d00 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
19d10 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
19d20 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
19d30 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
19d40 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
19d50 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
19d60 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
19d70 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
19d80 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
19d90 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
19da0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
19db0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
19dc0 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
19dd0 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
19de0 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
19df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
19e00 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
19e10 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
19e20 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19e30 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
19e40 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
19e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e60 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
19e70 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19e80 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
19e90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
19ea0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
19eb0 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
19ec0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
19ed0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
19ee0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19ef0 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
19f00 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
19f10 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
19f20 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
19f30 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
19f40 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
19f50 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
19f60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19f70 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c  */..  for(iDb=0,
19f80 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
19f90 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
19fa0 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
19fb0 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
19fc0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
19fd0 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
19fe0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
19ff0 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
1a000 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
1a010 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
1a020 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
1a030 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
1a040 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
1a050 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
1a060 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1a070 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1a080 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
1a090 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
1a0a0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
1a0b0 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
1a0d0 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
1a0e0 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
1a0f0 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
1a100 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
1a110 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
1a120 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
1a130 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
1a140 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
1a150 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
1a160 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
1a170 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
1a180 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
1a190 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
1a1a0 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
1a1b0 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
1a1c0 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
1a1d0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1a1e0 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
1a1f0 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
1a200 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
1a210 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
1a220 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
1a230 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
1a240 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
1a250 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
1a260 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
1a270 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1a280 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
1a290 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
1a2a0 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1a2b0 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
1a2c0 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
1a2d0 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
1a2e0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
1a2f0 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
1a300 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
1a310 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
1a320 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
1a330 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a340 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
1a350 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
1a360 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
1a370 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1a380 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1a390 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a3b0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
1a3c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
1a3d0 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1a3e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1a3f0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1a400 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
1a410 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
1a420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a430 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1a440 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
1a450 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1a460 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
1a470 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a480 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
1a490 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
1a4a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a4b0 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
1a4c0 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
1a4d0 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
1a4e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1a4f0 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
1a500 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
1a510 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
1a520 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1a530 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1a540 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1a550 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1a560 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1a570 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1a580 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
1a590 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e   pName1==0 || pN
1a5a0 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame1->z==0 ){.  
1a5b0 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
1a5c0 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
1a5d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
1a5e0 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30  se if( pName2==0
1a5f0 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
1a600 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a610 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
1a620 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1a630 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
1a640 45 4e 43 28 64 62 29 2c 20 28 63 68 61 72 2a 29  ENC(db), (char*)
1a650 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61 6d 65  pName1->z, pName
1a660 31 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  1->n, 0);.    if
1a670 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1a680 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 73   char *zColl = s
1a690 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
1a6a0 64 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  db, (const char 
1a6b0 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e 61  *)pName1->z, pNa
1a6c0 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 69  me1->n);.      i
1a6d0 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( zColl ){.    
1a6e0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
1a6f0 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
1a700 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
1a710 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 29  ite3_free(zColl)
1a720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a730 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
1a740 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1a750 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
1a760 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
1a770 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
1a780 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
1a790 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
1a7a0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a7b0 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
1a7c0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
1a7d0 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
1a7e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1a7f0 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
1a800 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
1a810 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
1a820 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
1a830 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
1a840 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
1a850 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
1a860 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1a870 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1a880 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
1a890 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
1a8a0 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66 28  3_free(z);.  if(
1a8b0 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
1a8c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a8d0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1a8e0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
1a8f0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1a900 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1a910 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
1a920 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
1a930 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1a940 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
1a950 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
1a960 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
1a970 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1a980 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61  ** Return a dyna
1a990 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  micly allocated 
1a9a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1a9b0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
1a9c0 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70  ed.** with OP_Op
1a9d0 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
1a9e0 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73  nWrite to access
1a9f0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1aa00 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  pIdx..**.** If s
1aa10 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69  uccessful, a poi
1aa20 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1aa30 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74  structure is ret
1aa40 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
1aa50 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  ase.** the calle
1aa60 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1aa70 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c   for calling sql
1aa80 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 74  ite3_free() on t
1aa90 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
1aaa0 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
1aab0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
1aac0 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
1aad0 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
1aae0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
1aaf0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1ab00 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
1ab10 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
1ab20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
1ab30 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
1ab40 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
1ab50 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
1ab60 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
1ab70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
1ab80 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
1ab90 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
1aba0 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
1abb0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f  (KeyInfo) + (nCo
1abc0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  l-1)*sizeof(Coll
1abd0 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20  Seq*) + nCol;.  
1abe0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
1abf0 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74  (KeyInfo *)sqlit
1ac00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 28 70 50  e3DbMallocZer(pP
1ac10 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 73  arse->db, nBytes
1ac20 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1ac30 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  {.    pKey->aSor
1ac40 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1ac50 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1ac60 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1ac70 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1ac80 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1ac90 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1aca0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1acb0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1acc0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1acd0 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1ace0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1acf0 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1ad00 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1ad10 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1ad20 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1ad30 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zColl, -1);.    
1ad40 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1ad50 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
1ad60 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
1ad70 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69   }.    pKey->nFi
1ad80 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a  eld = nCol;.  }.
1ad90 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1ada0 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
1adb0 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
1adc0 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     pKey = 0;.  }
1add0 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
1ade0 7d 0a                                            }.