/ Hex Artifact Content
Login

Artifact 2cde01caed5abaec38f579fabe343d89eb2907f7:


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 38 33 20 32 30 30 38 2f 30 34 2f 32 38  1.483 2008/04/28
02f0: 20 31 38 3a 34 36 3a 34 33 20 64 72 68 20 45 78   18:46:43 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 69 44 62  k *p;..  if( iDb
08e0: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
08f0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
0900: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  ; i<pParse->nTab
0910: 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  leLock; i++){.  
0920: 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
0930: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0940: 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44    if( p->iDb==iD
0950: 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54  b && p->iTab==iT
0960: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ab ){.      p->i
0970: 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d  sWriteLock = (p-
0980: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20  >isWriteLock || 
0990: 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20  isWriteLock);.  
09a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
09b0: 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20  }.  }..  nBytes 
09c0: 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f  = sizeof(TableLo
09d0: 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e  ck) * (pParse->n
09e0: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
09f0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a00: 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c 69  ck = .      sqli
0a10: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
0a20: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
0a30: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a40: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a50: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a60: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a70: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a80: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0a90: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0aa0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ab0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ac0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ad0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0ae0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0af0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  = zName;.  }else
0b00: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  {.    pParse->nT
0b10: 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  ableLock = 0;.  
0b20: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
0b30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
0b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
0b50: 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  e an OP_TableLoc
0b60: 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f  k instruction fo
0b70: 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63  r each table loc
0b80: 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ked by the.** st
0b90: 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75  atement (configu
0ba0: 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  red by calls to 
0bb0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0bc0: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ())..*/.static v
0bd0: 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  oid codeTableLoc
0be0: 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ks(Parse *pParse
0bf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0c00: 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 69  be *pVdbe; ..  i
0c10: 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20 73  f( 0==(pVdbe = s
0c20: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0c30: 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72 65  arse)) ){.    re
0c40: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  turn;.  }..  for
0c50: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
0c60: 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29  nTableLock; i++)
0c70: 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20  {.    TableLock 
0c80: 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54  *p = &pParse->aT
0c90: 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20  ableLock[i];.   
0ca0: 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62   int p1 = p->iDb
0cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0cc0: 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f  eAddOp4(pVdbe, O
0cd0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c  P_TableLock, p1,
0ce0: 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57   p->iTab, p->isW
0cf0: 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  riteLock,.      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41  p->zName, P4_STA
0d20: 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  TIC);.  }.}.#els
0d30: 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64 65  e.  #define code
0d40: 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65  TableLocks(x).#e
0d50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0d60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0d70: 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  ed after a singl
0d80: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
0d90: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73  has been.** pars
0da0: 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70 72  ed and a VDBE pr
0db0: 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74 65  ogram to execute
0dc0: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20   that statement 
0dd0: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70  has been.** prep
0de0: 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ared.  This rout
0df0: 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69 6e  ine puts the fin
0e00: 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20 6f  ishing touches o
0e10: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72  n the.** VDBE pr
0e20: 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74 73  ogram and resets
0e30: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0e40: 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e 65  cture for the ne
0e50: 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a  xt.** parse..**.
0e60: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
0e70: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
0e80: 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  d, it might be t
0e90: 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  he case that.** 
0ea0: 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61 73  no VDBE code was
0eb0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76   generated..*/.v
0ec0: 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69 73  oid sqlite3Finis
0ed0: 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a 70  hCoding(Parse *p
0ee0: 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
0ef0: 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
0f00: 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  ;..  db = pParse
0f10: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
0f20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
0f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f40: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72 65  rse->nested ) re
0f50: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
0f60: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
0f70: 6e 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  n;.  if( !pParse
0f80: 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69  ->pVdbe ){.    i
0f90: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
0fa0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72  QLITE_OK && pPar
0fb0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
0fc0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0fd0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
0fe0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0ff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1000: 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73   by generating s
1010: 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  ome termination 
1020: 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20  code at the end 
1030: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65  of the.  ** vdbe
1040: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20   program.  */.  
1050: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1060: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1070: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1080: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1090: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f  OP_Halt);..    /
10a0: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
10b0: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
10c0: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
10d0: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
10e0: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
10f0: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
1100: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
1110: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
1120: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
1130: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1140: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
1150: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
1160: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
1170: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1180: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
1190: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
11a0: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
11b0: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
11c0: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
11e0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
11f0: 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20  Goto>0 ){.      
1200: 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  u32 mask;.      
1210: 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20 20 20  int iDb, i;.    
1220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1230: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1240: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1250: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1260: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
1270: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
1280: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
1290: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12a0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12d0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
12e0: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
12f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1300: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1310: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1320: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1330: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  !=0);.        sq
1340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1350: 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69  v,OP_VerifyCooki
1360: 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e  e, iDb, pParse->
1370: 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
1380: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
1390: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13a0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
13b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
13c0: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20  rse->nVtabLock; 
13d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
13e0: 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72  ar *vtab = (char
13f0: 20 2a 29 70 50 61 72 73 65 2d 3e 61 70 56 74 61   *)pParse->apVta
1400: 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74 61 62 3b  bLock[i]->pVtab;
1410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1420: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1430: 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30  _VBegin, 0, 0, 0
1440: 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29  , vtab, P4_VTAB)
1450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1460: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1470: 6b 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  k = 0;.#endif.. 
1480: 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c       /* Once all
1490: 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76   the cookies hav
14a0: 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  e been verified 
14b0: 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  and transactions
14c0: 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20   opened, .      
14d0: 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65  ** obtain the re
14e0: 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63  quired table-loc
14f0: 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  ks. This is a no
1500: 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a  -op unless the .
1510: 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d        ** shared-
1520: 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73  cache feature is
1530: 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20   enabled..      
1540: 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62  */.      codeTab
1550: 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b  leLocks(pParse);
1560: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1570: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1580: 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  oto, 0, pParse->
1590: 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20  cookieGoto);.   
15a0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
15b0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
15c0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
15d0: 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  busy ){.      /*
15e0: 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 61   Change the P4 a
15f0: 72 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  rgument of the f
1600: 69 72 73 74 20 6f 70 63 6f 64 65 20 28 77 68 69  irst opcode (whi
1610: 63 68 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ch will always b
1620: 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 4f 50  e.      ** an OP
1630: 5f 54 72 61 63 65 29 20 74 6f 20 62 65 20 74 68  _Trace) to be th
1640: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
1650: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  of the current S
1660: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  QL statement..  
1670: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 56 64 62      */.      Vdb
1680: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
1690: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 30  e3VdbeGetOp(v, 0
16a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
16b0: 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   && pOp->opcode=
16c0: 3d 4f 50 5f 54 72 61 63 65 20 29 7b 0a 20 20 20  =OP_Trace ){.   
16d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16e0: 43 68 61 6e 67 65 50 34 28 76 2c 20 30 2c 20 70  ChangeP4(v, 0, p
16f0: 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61  Parse->zSql, pPa
1700: 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73  rse->zTail-pPars
1710: 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  e->zSql);.      
1720: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
1730: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
1740: 41 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f  ACE */.  }...  /
1750: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
1760: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
1770: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
1780: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
1790: 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64  e->nErr==0 && !d
17a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17b0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17c0: 5f 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20  _DEBUG.    FILE 
17d0: 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c  *trace = (db->fl
17e0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
17f0: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
1800: 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c  out : 0;.    sql
1810: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c  ite3VdbeTrace(v,
1820: 20 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a   trace);.#endif.
1830: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1840: 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
1850: 63 68 65 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  che==0 );  /* Di
1860: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1870: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1890: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
18a0: 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d  e->nVar, pParse-
18b0: 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20  >nMem+3,.       
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33    pParse->nTab+3
18e0: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
18f0: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
1900: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1910: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
1920: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20  lNamesSet = 0;. 
1930: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
1940: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
1950: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1960: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1970: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
1980: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
1990: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
19a0: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
19b0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
19c0: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
19d0: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
19e0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
19f0: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
1a00: 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73  .** Run the pars
1a10: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
1a20: 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c  rator recursivel
1a30: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  y in order to ge
1a40: 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66  nerate.** code f
1a50: 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  or the SQL state
1a60: 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20  ment given onto 
1a70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1a80: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a  Parse context.**
1a90: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1aa0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
1ab0: 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  When the parser 
1ac0: 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65  is run recursive
1ad0: 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20  ly.** this way, 
1ae0: 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  the final OP_Hal
1af0: 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65  t is not appende
1b00: 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74  d and other init
1b10: 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  ialization.** an
1b20: 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73  d finalization s
1b30: 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64  teps are omitted
1b40: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61   because those a
1b50: 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74  re handling by t
1b60: 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20  he.** outermost 
1b70: 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  parser..**.** No
1b80: 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  t everything is 
1b90: 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20  nestable.  This 
1ba0: 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69  facility is desi
1bb0: 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a  gned to permit.*
1bc0: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
1bd0: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  , and DELETE ope
1be0: 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20  rations against 
1bf0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20  SQLITE_MASTER.  
1c00: 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79  Use.** care if y
1c10: 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79  ou decide to try
1c20: 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75   to use this rou
1c30: 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  tine for some ot
1c40: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
1c50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73  .void sqlite3Nes
1c60: 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a  tedParse(Parse *
1c70: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1c80: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1c90: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1ca0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23  .  char *zSql;.#
1cb0: 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20   define SAVE_SZ 
1cc0: 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20   (sizeof(Parse) 
1cd0: 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65  - offsetof(Parse
1ce0: 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73  ,nVar)).  char s
1cf0: 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b  aveBuf[SAVE_SZ];
1d00: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1d10: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
1d20: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1d30: 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f  >nested<10 );  /
1d40: 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64  * Nesting should
1d50: 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69   only be of limi
1d60: 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76  ted depth */.  v
1d70: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
1d80: 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
1d90: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
1da0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d  Parse->db, zForm
1db0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1dc0: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
1dd0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  l==0 ){.    pPar
1de0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1df0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
1e00: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1e10: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1e20: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1e30: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1e40: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1e50: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1e60: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1e70: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1e80: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1e90: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1ea0: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1eb0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
1ec0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d  ree(zSql);.  mem
1ed0: 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  cpy(&pParse->nVa
1ee0: 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45  r, saveBuf, SAVE
1ef0: 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  _SZ);.  pParse->
1f00: 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  nested--;.}../*.
1f10: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1f20: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1f30: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1f40: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1f50: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1f60: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1f70: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1f80: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1f90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1fa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1fb0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1fc0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1fd0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
1fe0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
1ff0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
2000: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
2010: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
2020: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2030: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
2040: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
2050: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
2060: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
2070: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
2080: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
2090: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
20a0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
20b0: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
20c0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
20d0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
20e0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
20f0: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
2100: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
2110: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2120: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
2130: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2140: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2150: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
2160: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
2170: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
2180: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
2190: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
21a0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
21b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
21c0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
21d0: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
21e0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
21f0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2200: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2210: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2220: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
2230: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2240: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
2250: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2260: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2270: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2280: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
2290: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
22a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
22b0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
22c0: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
22d0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
22e0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
22f0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
2300: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
2310: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2320: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
2330: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2340: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2350: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2360: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2370: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2380: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
2390: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
23a0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
23b0: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
23c0: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
23d0: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
23e0: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
23f0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
2400: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
2410: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
2420: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2430: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
2440: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
2450: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
2460: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
2470: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2480: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
2490: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
24a0: 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68  context in which
24b0: 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72   to report error
24c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  s */.  int isVie
24d0: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w,            /*
24e0: 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67   True if looking
24f0: 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68   for a VIEW rath
2500: 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20  er than a TABLE 
2510: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2520: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
2530: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
2540: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
2550: 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  for */.  const c
2560: 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20  har *zDbase     
2570: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2580: 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20  atabase.  Might 
2590: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
25a0: 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Table *p;..  /* 
25b0: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
25c0: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
25d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
25e0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
25f0: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
2600: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
2610: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
2620: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
2630: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
2640: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
2650: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2660: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
2670: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
2680: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
2690: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
26a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
26b0: 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77  r *zMsg = isView
26c0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
26d0: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
26e0: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
26f0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
2700: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2710: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
2720: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
2730: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
2740: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2750: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2760: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
2770: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
2780: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
2790: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
27a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
27b0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
27c0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
27d0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
27e0: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
27f0: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2800: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2810: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2820: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2830: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2840: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
2850: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
2860: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2870: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2880: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2890: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
28a0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
28b0: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
28c0: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
28d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
28e0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
28f0: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2900: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2910: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2920: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
2930: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2940: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
2950: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2960: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
2970: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2980: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
2990: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
29a0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
29b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
29c0: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
29d0: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
29e0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  nt i;.  for(i=OM
29f0: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2a00: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2a10: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2a20: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2a30: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2a40: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
2a50: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
2a60: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2a70: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2a80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a90: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2aa0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2ab0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2ac0: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2ad0: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2ae0: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2af0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2b00: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2b10: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2b20: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
2b30: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2b40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20      }.    if( p 
2b50: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2b60: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2b70: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
2b80: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
2b90: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
2ba0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
2bb0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
2bc0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 6c  te3_free(p->zCol
2bd0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Aff);.  sqlite3_
2be0: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
2bf0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
2c00: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
2c10: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2c20: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
2c30: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
2c40: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
2c50: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
2c60: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2c70: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
2c80: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
2c90: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2ca0: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
2cb0: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
2cc0: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
2cd0: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
2ce0: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
2cf0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
2d00: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2d10: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64  eDeleteIndex(Ind
2d20: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2d30: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2d40: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2d50: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
2d60: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2d70: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
2d80: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2d90: 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31  strlen( zName)+1
2da0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2db0: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2dc0: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2dd0: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2de0: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2df0: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2e00: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2e10: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2e20: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2e30: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2e40: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2e50: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2e60: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2e70: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2e80: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2e90: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2ea0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
2eb0: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2ec0: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2ed0: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2ee0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2ef0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2f00: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2f10: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2f20: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2f30: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2f40: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2f50: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2f60: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2f70: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2f80: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
2f90: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
2fa0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
2fb0: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
2fc0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2fd0: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
2fe0: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2ff0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
3000: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
3020: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
3030: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
3040: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
3050: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3060: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
3070: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
3080: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3090: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
30a0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
30b0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
30c0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
30d0: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
30e0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
30f0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3100: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
3110: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3120: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3130: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3140: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3150: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3160: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3170: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3180: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3190: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
31a0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
31b0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
31c0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
31d0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
31e0: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
31f0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3200: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3210: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3220: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
3240: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
3250: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
3260: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
3270: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
3280: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
3290: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
32a0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
32b0: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
32c0: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
32d0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
32e0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
32f0: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
3300: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
3310: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65  int i, j;.  asse
3320: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3330: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3340: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20  if( iDb==0 ){.  
3350: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
3360: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  terAll(db);.  }.
3370: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
3380: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3390: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
33a0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
33b0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
33c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69 3d  .      assert(i=
33d0: 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20  =1 || (pDb->pBt 
33e0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  && sqlite3BtreeH
33f0: 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70  oldsMutex(pDb->p
3400: 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Bt)));.      sql
3410: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
3420: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
3430: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
3440: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
3450: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
3460: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
3470: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
3480: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
3490: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
34a0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  (db);..  /* If o
34b0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
34c0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
34d0: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
34e0: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
34f0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
3500: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
3510: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
3520: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
3530: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
3540: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
3550: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
3560: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
3570: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3580: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3590: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
35a0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
35b0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
35c0: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
35d0: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
35e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
35f0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3600: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3610: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3620: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
3630: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
3640: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
3650: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
3660: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
3670: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3680: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3690: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
36a0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
36b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
36c0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
36d0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
36e0: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
36f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3700: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3710: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3720: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3740: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3750: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3760: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3770: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3780: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3790: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
37a0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
37b0: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
37c0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
37d0: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
37e0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
37f0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3800: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3810: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3820: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3830: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
3840: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
3850: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3860: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3870: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3880: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3890: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
38a0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
38b0: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
38c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
38d0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
38e0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
38f0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
3900: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
3910: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
3920: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
3930: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3940: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
3950: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3960: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3970: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3980: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3990: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
39a0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
39b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
39c0: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
39d0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
39e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
39f0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3a00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3a10: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
3a20: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3a30: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
3a40: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
3a50: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3a60: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3a70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3a80: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3a90: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3aa0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3ab0: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3ac0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3ad0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3ae0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3af0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3b00: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3b10: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3b20: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3b30: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3b40: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3b50: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3b60: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3b70: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3b80: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3b90: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3ba0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3bb0: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3bc0: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3bd0: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3be0: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3bf0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3c00: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3c10: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3c20: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3c30: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3c40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3c50: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3c70: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3c80: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3c90: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3ca0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3cb0: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3cc0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3cd0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3ce0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3cf0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3d00: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3d10: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3d20: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3d30: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3d40: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3d50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3d60: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3d70: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3d80: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3d90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3da0: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3db0: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3dc0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3dd0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3de0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3df0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3e00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3e10: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3e20: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3e40: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3e50: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3e60: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3e70: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3e80: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3e90: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3ea0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3eb0: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3ec0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3ed0: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3ee0: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3ef0: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3f00: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3f10: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3f20: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3f30: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3f40: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3f50: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3f60: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3f70: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
3f80: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
3f90: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3fb0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
3fc0: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3fd0: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3fe0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
3ff0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
4000: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
4010: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
4020: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
4030: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
4040: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
4050: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
4060: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4070: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
4080: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
4090: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
40a0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
40b0: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
40c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
40d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
40e0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
40f0: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
4100: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
4110: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
4120: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
4130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
4140: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
4150: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4160: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
4170: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
4180: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
4190: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
41a0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
41b0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
41c0: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
41d0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
41e0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
41f0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
4200: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
4210: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
4220: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
4230: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
4240: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
4250: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4260: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
4270: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
4280: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
4290: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
42a0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
42b0: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
42c0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
42d0: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
42e0: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
42f0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
4300: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4310: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4320: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
4330: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
4340: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
4350: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
4360: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
4370: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
4380: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4390: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
43a0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
43b0: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
43c0: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
43d0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
43e0: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
43f0: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
4400: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
4410: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
4420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
4430: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
4440: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
4450: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
4460: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
4470: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
4480: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
4490: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
44a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
44b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
44c0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
44d0: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
44e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
44f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4510: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
4520: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
4530: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
4540: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
4550: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
4560: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
4570: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
4580: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
4590: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
45a0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
45b0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
45c0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
45d0: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
45e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
45f0: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
4600: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
4610: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
4620: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
4630: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
4640: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
4650: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
4660: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
4670: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
4680: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
4690: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
46a0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
46b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
46c0: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
46d0: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
46e0: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
46f0: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
4700: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
4710: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
4720: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
4730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4740: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
4750: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
4760: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
4770: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
4780: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
4790: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
47a0: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
47b0: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
47c0: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
47d0: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
47e0: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
47f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4800: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
4810: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
4820: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
4830: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
4840: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
4850: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
4860: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
4870: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4890: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
48a0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
48b0: 29 3b 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  );/* sqlite_mast
48c0: 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73  er has 5 columns
48d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
48e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
48f0: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
4900: 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 7d  ER_ROOT, iDb);.}
4910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
4920: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
4930: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
4940: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
4950: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
4960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
4970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
4980: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
4990: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
49a0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
49b0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
49c0: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
49d0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
49e0: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
49f0: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
4a00: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
4a10: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4a20: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
4a30: 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61  -1;    /* Databa
4a40: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
4a50: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
4a60: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
4a70: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
4a80: 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20  e */.  Db *pDb; 
4a90: 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62        /* A datab
4aa0: 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73  ase whose name s
4ab0: 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65  pace is being se
4ac0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72  arched */.  char
4ad0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
4ae0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
4af0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e  ing for */..  zN
4b00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
4b10: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
4b20: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
4b30: 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74  me ){.    n = st
4b40: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
4b50: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
4b60: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
4b70: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
4b80: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
4b90: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
4ba0: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
4bb0: 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d  strlen(pDb->zNam
4bc0: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  e) && .         
4bd0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
4be0: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
4bf0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
4c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4c10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4c20: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  3_free(zName);. 
4c30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
4c40: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
4c50: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
4c60: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
4c70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
4c80: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
4c90: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
4ca0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
4cb0: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
4cc0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
4cd0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
4ce0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
4cf0: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
4d00: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4d10: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4d20: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
4d30: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
4d40: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
4d50: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4d60: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4d70: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4d80: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
4d90: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
4da0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
4db0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4dc0: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
4dd0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
4de0: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
4df0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4e00: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
4e10: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
4e20: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
4e30: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
4e40: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
4e50: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
4e60: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
4e70: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
4e80: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
4e90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4ea0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4eb0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4ec0: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4ed0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4ee0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
4ef0: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
4f00: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
4f10: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
4f20: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
4f30: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
4f40: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
4f50: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
4f60: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
4f70: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
4f80: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
4fa0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
4fb0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4fc0: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
4fd0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
4fe0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4ff0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
5000: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
5010: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5020: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
5030: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
5040: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
5050: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5060: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
5070: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
5080: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5090: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
50a0: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
50b0: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
50c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
50d0: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
50e0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
50f0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
5100: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
5110: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
5120: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
5130: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
5140: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
5150: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
5160: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
5170: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5180: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
5190: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
51a0: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
51b0: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
51c0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
51d0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
51e0: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
51f0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
5200: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
5210: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
5220: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
5230: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
5240: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
5250: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
5260: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
5270: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
5280: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
5290: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
52a0: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
52b0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
52c0: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
52d0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
52e0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
52f0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
5300: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
5310: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
5320: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
5330: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
5340: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
5350: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
5360: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
5370: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
5380: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
5390: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
53a0: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
53b0: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
53c0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
53d0: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
53e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
53f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5400: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5410: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
5420: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
5430: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
5440: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
5450: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
5460: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
5470: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
5480: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
5490: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
54a0: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
54b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
54c0: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
54d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
54e0: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
54f0: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
5500: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
5510: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
5520: 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70  name. The isTemp
5530: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
5540: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
5550: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
5560: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
5570: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5580: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
5590: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
55a0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
55b0: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
55c0: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
55d0: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
55e0: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
55f0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
5600: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
5610: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
5620: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
5630: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
5640: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
5650: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
5660: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
5670: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5680: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
5690: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
56a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
56b0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
56c0: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
56d0: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
56e0: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
56f0: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
5700: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
5710: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
5720: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
5730: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
5740: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
5750: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
5760: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
5770: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5780: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
5790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
57a0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
57b0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
57c0: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
57d0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
57e0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
57f0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
5800: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
5810: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
5820: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
5830: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
5840: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
5850: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5860: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
5870: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
5880: 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew,      /* True
5890: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
58a0: 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  EW */.  int isVi
58b0: 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65  rtual,   /* True
58c0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
58d0: 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20  RTUAL table */. 
58e0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
58f0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5900: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
5910: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
5920: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
5930: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
5940: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
5950: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
5960: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5970: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5980: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
5990: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
59a0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
59b0: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
59c0: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
59d0: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
59e0: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
59f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5a00: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
5a10: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
5a20: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
5a30: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5a40: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5a50: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
5a60: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
5a70: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5a80: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5a90: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5aa0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5ab0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5ac0: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
5ad0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5ae0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5af0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5b00: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5b10: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
5b20: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5b30: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5b40: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
5b50: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5b60: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
5b70: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5b80: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5b90: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5ba0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5bb0: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
5bc0: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
5bd0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5be0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5bf0: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
5c00: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5c10: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
5c20: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
5c30: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
5c40: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
5c50: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5c60: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
5c70: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
5c80: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
5c90: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73  ..  */.  iDb = s
5ca0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5cb0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
5cc0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
5cd0: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
5ce0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
5cf0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5d00: 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29  sTemp && iDb>1 )
5d10: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61  {.    /* If crea
5d20: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
5d30: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
5d40: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
5d50: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
5d60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5d70: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
5d80: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
5d90: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
5da0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
5db0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5dc0: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
5dd0: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
5de0: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
5df0: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
5e00: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5e10: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5e20: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
5e30: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
5e40: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
5e50: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
5e60: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
5e70: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
5e80: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5e90: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
5ea0: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
5eb0: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
5ec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5ed0: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
5ee0: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
5ef0: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
5f00: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
5f10: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
5f20: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
5f30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5f40: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5f50: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
5f60: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
5f70: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
5f80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
5f90: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5fa0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
5fb0: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
5fc0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5fd0: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5fe0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5ff0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
6000: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
6010: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6020: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
6030: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
6040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
6050: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6060: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
6070: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6080: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
6090: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
60a0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
60b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
60c0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
60d0: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
60e0: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
60f0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
6100: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
6110: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
6120: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6130: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6140: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
6150: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
6160: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
6170: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
6180: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
6190: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
61a0: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
61b0: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
61c0: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
61d0: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
61e0: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
61f0: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
6200: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
6210: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
6220: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
6230: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
6240: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
6250: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
6260: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
6270: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
6280: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
6290: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
62a0: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
62b0: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
62c0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
62d0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
62e0: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
62f0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
6300: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
6310: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6320: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6330: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65      }.    pTable
6340: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
6350: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64  ble(db, zName, d
6360: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6370: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  e);.    if( pTab
6380: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
6390: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
63a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
63b0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
63c0: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
63d0: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
63e0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
63f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6400: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
6410: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
6420: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  x(db, zName, 0)!
6430: 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c  =0 && (iDb==0 ||
6440: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29   !db->init.busy)
6450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6460: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6470: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
6480: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
6490: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
64a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
64b0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
64c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c    }.  }..  pTabl
64d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
64e0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
64f0: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
6500: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
6510: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
6520: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  led = 1;.    pPa
6530: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
6540: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
6550: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
6560: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6570: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
6580: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
6590: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  ame;.  pTable->i
65a0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
65b0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ble->pSchema = d
65c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
65d0: 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ema;.  pTable->n
65e0: 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Ref = 1;.  if( p
65f0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6600: 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65   ) sqlite3Delete
6610: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e  Table(pParse->pN
6620: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
6630: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
6640: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
6650: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
6660: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
6670: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
6680: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
6690: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
66a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
66b0: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
66c0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
66d0: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
66e0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
66f0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
6700: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
6710: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6720: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
6730: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
6740: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
6750: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
6760: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
6770: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
6780: 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61  a->pSeqTab = pTa
6790: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
67a0: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
67b0: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
67c0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
67d0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
67e0: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
67f0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
6800: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
6810: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
6820: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
6830: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
6840: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
6850: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
6860: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
6870: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
6880: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
6890: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
68a0: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
68b0: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
68c0: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
68d0: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
68e0: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
68f0: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
6900: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
6910: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
6920: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
6930: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
6940: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
6950: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
6960: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
6970: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
6980: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
6990: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  se))!=0 ){.    i
69a0: 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66  nt j1;.    int f
69b0: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
69c0: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
69d0: 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg3;.    sqlite3
69e0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
69f0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
6a00: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
6a10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6a20: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
6a30: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
6a40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a50: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
6a60: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
6a70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
6a80: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
6a90: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
6aa0: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
6ab0: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
6ac0: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
6ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
6ae0: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
6af0: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
6b00: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
6b10: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
6b20: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6b30: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
6b40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6b50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b60: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
6b70: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
6b80: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
6b90: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ormat */.    sql
6ba0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6bb0: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a  e(v, iDb);.    j
6bc0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
6bd0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
6be0: 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46  reg3);.    fileF
6bf0: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
6c00: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
6c10: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
6c40: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
6c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6c70: 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72  r, fileFormat, r
6c80: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6c90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6ca0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6cb0: 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 1, reg3);.    
6cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cd0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6ce0: 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b   ENC(db), reg3);
6cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6d00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
6d10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 2c 20  Cookie, iDb, 4, 
6d20: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6d30: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6d40: 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  , j1);..    /* T
6d50: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
6d60: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
6d70: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
6d80: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6d90: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
6da0: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
6db0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
6dc0: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
6dd0: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
6de0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
6df0: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
6e00: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
6e10: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
6e20: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6e30: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
6e40: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
6e50: 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  eft on the top o
6e60: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  f the stack..   
6e70: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76 61   ** The rowid va
6e80: 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20 62 79  lue is needed by
6e90: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
6ea0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
6eb0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  ill.    ** gener
6ec0: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
6ed0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6ee0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
6ef0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6f00: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
6f10: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
6f20: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
6f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6f40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6f50: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
6f60: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
6f70: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  f.    {.      sq
6f80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6f90: 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  v, OP_CreateTabl
6fa0: 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20  e, iDb, reg2);. 
6fb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6fc0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
6fd0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
6fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ff0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7000: 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20  id, 0, reg1);.  
7010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7020: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
7030: 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  0, reg3);.    sq
7040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7050: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
7060: 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20   reg3, reg1);.  
7070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7080: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7090: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
70a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
70b0: 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d  , OP_Close);.  }
70c0: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e  ..  /* Normal (n
70d0: 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e  on-error) return
70e0: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  . */.  return;..
70f0: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
7100: 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70   occurs, we jump
7110: 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74   here */.begin_t
7120: 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71  able_error:.  sq
7130: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
7140: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
7150: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
7160: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
7170: 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  are two strings 
7180: 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73  in a case-insens
7190: 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a  itive manner..**
71a0: 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20   It is slightly 
71b0: 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c  faster than call
71c0: 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43  ing sqlite3StrIC
71d0: 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62  mp() directly, b
71e0: 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c  ut.** produces l
71f0: 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  arger code..**.*
7200: 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20  * WARNING: This 
7210: 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d  macro is not com
7220: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
7230: 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79   strcmp() family
7240: 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  . It.** returns 
7250: 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20  true if the two 
7260: 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61  strings are equa
7270: 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c  l, otherwise fal
7280: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  se..*/.#define S
7290: 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a  TRICMP(x, y) (\.
72a0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
72b0: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
72c0: 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c  har *)(x)]==   \
72d0: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
72e0: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
72f0: 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20  char *)(y)]     
7300: 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  \.&& sqlite3StrI
7310: 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29  Cmp((x)+1,(y)+1)
7320: 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ==0 )../*.** Add
7330: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
7340: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
7350: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
7360: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
7370: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
7380: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
7390: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
73a0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
73b0: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
73c0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
73d0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
73e0: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
73f0: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
7400: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
7410: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7420: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
7430: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
7440: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
7450: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
7460: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
7470: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
7480: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
7490: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
74a0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
74b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
74c0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
74d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
74e0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53   ) return;.#if S
74f0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
7500: 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31  .  if( p->nCol+1
7510: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
7520: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
7530: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7540: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7550: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
7560: 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  s on %s", p->zNa
7570: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
7580: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20  .  }.#endif.  z 
7590: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
75a0: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
75b0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
75c0: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
75d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
75e0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
75f0: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7600: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7610: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7620: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7630: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
7640: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
7650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7660: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
7670: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7680: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7690: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
76a0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
76b0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
76c0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 50 61 72  e3DbRealloc(pPar
76d0: 73 65 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  se->db,p->aCol,(
76e0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
76f0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
7700: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
7710: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7720: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
7730: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7740: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
7750: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
7760: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
7770: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
7780: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
7790: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
77a0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
77b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
77c0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
77d0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
77e0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
77f0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
7800: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
7810: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
7820: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
7830: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
7840: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
7850: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
7860: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
7870: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
7880: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7890: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
78a0: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
78b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78c0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
78d0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
78e0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
78f0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7900: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7910: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
7920: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
7930: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
7940: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
7950: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
7960: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
7970: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
7980: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7990: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
79a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
79b0: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
79c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
79d0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
79e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
79f0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
7a00: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
7a10: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
7a20: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
7a30: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
7a40: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
7a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
7a60: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
7a70: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
7a80: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
7a90: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
7aa0: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
7ab0: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
7ac0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
7ad0: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
7ae0: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
7af0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
7b00: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
7b10: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
7b20: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
7b30: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
7b40: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
7b50: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
7b60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
7b70: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
7b80: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
7b90: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7ba0: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
7bb0: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
7bc0: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
7bd0: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
7be0: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
7bf0: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
7c00: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
7c10: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
7c20: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
7c30: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
7c40: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c60: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
7c70: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7c80: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
7c90: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
7ca0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7cb0: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
7cc0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7cd0: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
7ce0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7cf0: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
7d00: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7d10: 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c  FF_NONE.** 'REAL
7d20: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7d30: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
7d40: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
7d50: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7d60: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
7d70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7d80: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
7d90: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7da0: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
7db0: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
7dc0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
7dd0: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
7de0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
7df0: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7e00: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  nst Token *pType
7e10: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
7e20: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
7e30: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
7e40: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7e50: 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54  d char *zIn = pT
7e60: 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20  ype->z;.  const 
7e70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
7e80: 45 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b  End = &pType->z[
7e90: 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68  pType->n];..  wh
7ea0: 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29  ile( zIn!=zEnd )
7eb0: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
7ec0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
7ed0: 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20  oLower[*zIn];.  
7ee0: 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28    zIn++;.    if(
7ef0: 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28   h==(('c'<<24)+(
7f00: 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'h'<<16)+('a'<<8
7f10: 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20  )+'r') ){       
7f20: 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f        /* CHAR */
7f30: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7f40: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20  ITE_AFF_TEXT; . 
7f50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7f60: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
7f70: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
7f80: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
7f90: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
7fa0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7fb0: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
7fc0: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
7fd0: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
7fe0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
7ff0: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
8000: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8010: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
8020: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
8030: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8040: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
8050: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
8060: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
8070: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8080: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
8090: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
80a0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
80b0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69  ITE_AFF_NONE;.#i
80c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
80d0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
80e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
80f0: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
8100: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
8110: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
8120: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
8130: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
8140: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
8150: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8160: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
8170: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8180: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
8190: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
81a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
81b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
81c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
81d0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
81e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
81f0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
8200: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
8210: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
8220: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
8230: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
8240: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8250: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8260: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8270: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8280: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
8290: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
82a0: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
82b0: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
82c0: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
82d0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
82e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
82f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8300: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
8310: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
8320: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8330: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
8340: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
8350: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
8360: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
8370: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8380: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
8390: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
83a0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
83b0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
83c0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
83d0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
83e0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
83f0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8400: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
8410: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
8420: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
8430: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
8440: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
8450: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
8460: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
8470: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
8480: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
8490: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
84a0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
84b0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
84c0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
84d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
84e0: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54  ken *pType){.  T
84f0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
8500: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8510: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
8520: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
8530: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8540: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
8550: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
8560: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
8570: 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74  aCol[i];.  sqlit
8580: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
8590: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54  ype);.  pCol->zT
85a0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ype = sqlite3Nam
85b0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
85c0: 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20  e->db, pType);. 
85d0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
85e0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
85f0: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
8600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
8610: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
8620: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8630: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8640: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
8650: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
8660: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8670: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
8680: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
8690: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
86a0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
86b0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
86c0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
86d0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
86e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
86f0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
8700: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
8710: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
8720: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
8730: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8740: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
8750: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
8760: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
8770: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
8780: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
8790: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
87a0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
87b0: 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b  pNewTable)!=0 ){
87c0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
87d0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
87e0: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
87f0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8800: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
8810: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
8820: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8830: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
8840: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
8850: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
8860: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
8870: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
8880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
8890: 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20  r *pCopy;.      
88a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
88b0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
88c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
88d0: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
88e0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
88f0: 74 20 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69  t = pCopy = sqli
8900: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8910: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
8920: 20 70 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20   pCopy ){.      
8930: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
8940: 70 79 28 64 62 2c 20 26 70 43 6f 70 79 2d 3e 73  py(db, &pCopy->s
8950: 70 61 6e 2c 20 26 70 45 78 70 72 2d 3e 73 70 61  pan, &pExpr->spa
8960: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
8970: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
8980: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
8990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
89a0: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
89b0: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
89c0: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
89d0: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
89e0: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
89f0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
8a00: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
8a10: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
8a20: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
8a30: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
8a40: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
8a50: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
8a60: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
8a70: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
8a80: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
8a90: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
8aa0: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
8ab0: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
8ac0: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
8ad0: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
8ae0: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
8af0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
8b00: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
8b10: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
8b20: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
8b30: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
8b40: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
8b50: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
8b60: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
8b70: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
8b80: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
8b90: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
8ba0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
8bb0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
8bc0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
8bd0: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
8be0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
8bf0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
8c00: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
8c10: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
8c20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
8c30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
8c40: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
8c50: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
8c60: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
8c70: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
8c80: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
8c90: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
8ca0: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
8cb0: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
8cc0: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
8cd0: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
8ce0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
8cf0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8d00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8d10: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
8d20: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
8d30: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
8d40: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
8d50: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
8d60: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
8d70: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
8d80: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
8d90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
8da0: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
8db0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
8dc0: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
8dd0: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
8de0: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
8df0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
8e00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
8e10: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8e20: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
8e30: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
8e40: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66  ol = -1, i;.  if
8e50: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
8e60: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
8e70: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
8e80: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
8e90: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8eb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
8ec0: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
8ed0: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
8ee0: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
8ef0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
8f00: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
8f10: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
8f20: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
8f30: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
8f40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
8f50: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
8f60: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
8f70: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
8f80: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
8f90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8fa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8fb0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
8fc0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
8fd0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
8fe0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8ff0: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
9000: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
9010: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9020: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
9030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9040: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9050: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
9060: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
9070: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
9080: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
9090: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
90a0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
90b0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
90c0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
90d0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
90e0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
90f0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
9100: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
9110: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
9120: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
9130: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
9140: 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ER")==0.        
9150: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
9160: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20  LITE_SO_ASC ){. 
9170: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
9180: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
9190: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
91a0: 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75  or;.    pTab->au
91b0: 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b  toInc = autoInc;
91c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
91d0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
91e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
91f0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
9200: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9210: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
9220: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
9230: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
9240: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
9250: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
9260: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
9270: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
9280: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9290: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
92a0: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
92b0: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
92c0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
92d0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
92e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
92f0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
9300: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
9310: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
9320: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
9330: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9340: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9350: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
9360: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
9370: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
9380: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
9390: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
93a0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
93b0: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
93c0: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
93d0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
93e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
93f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
9400: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9410: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le;.  sqlite3 *d
9420: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9430: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
9440: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
9450: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45  {.    /* The CHE
9460: 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  CK expression mu
9470: 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64  st be duplicated
9480: 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20   so that tokens 
9490: 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  refer.    ** to 
94a0: 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61  malloced space a
94b0: 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65  nd not the (ephe
94c0: 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74  meral) text of t
94d0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a  he CREATE TABLE.
94e0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
94f0: 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   */.    pTab->pC
9500: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
9510: 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e  prAnd(db, pTab->
9520: 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20  pCheck, .       
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9550: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
9560: 68 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a  heckExpr));.  }.
9570: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
9580: 45 78 70 72 44 65 6c 65 74 65 28 70 43 68 65 63  ExprDelete(pChec
9590: 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  kExpr);.}../*.**
95a0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
95b0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
95c0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
95d0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
95e0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
95f0: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
9600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9610: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
9620: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9630: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
9640: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9650: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
9660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9670: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
9680: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9690: 63 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 20  ce */..  if( (p 
96a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
96b0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
96c0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
96d0: 31 3b 0a 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  1;..  zColl = sq
96e0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
96f0: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
9700: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
9710: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
9720: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
9730: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
9740: 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b  e, zColl, -1) ){
9750: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9760: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  ;.    p->aCol[i]
9770: 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a  .zColl = zColl;.
9780: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
9790: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
97a0: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
97b0: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
97c0: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20  TE <type>",.    
97d0: 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78  ** then an index
97e0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
97f0: 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63  reated on this c
9800: 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65  olumn before the
9810: 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  .    ** collatio
9820: 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64  n type was added
9830: 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69  . Correct this i
9840: 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65  f it is the case
9850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9860: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
9870: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
9880: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
9890: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
98a0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
98b0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
98c0: 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20  lumn[0]==i ){.  
98d0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
98e0: 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b  ll[0] = p->aCol[
98f0: 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  i].zColl;.      
9900: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
9910: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9920: 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  e(zColl);.  }.}.
9930: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9940: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
9950: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9960: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
9970: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
9980: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
9990: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
99a0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
99b0: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
99c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
99d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
99e0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
99f0: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
9a00: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
9a10: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
9a20: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
9a30: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
9a40: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
9a50: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
9a60: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9a70: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
9a80: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
9a90: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
9aa0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
9ab0: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
9ac0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
9ad0: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
9ae0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
9af0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
9b00: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
9b10: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9b20: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
9b30: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
9b40: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
9b50: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
9b60: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
9b70: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
9b80: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
9b90: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
9ba0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
9bb0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
9bc0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
9bd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
9be0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
9bf0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
9c00: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
9c10: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
9c20: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
9c30: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
9c40: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f  r message..*/.Co
9c50: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
9c60: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
9c70: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9c80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
9c90: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69  t nName){.  sqli
9ca0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9cb0: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
9cc0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
9cd0: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
9ce0: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
9cf0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
9d00: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
9d10: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
9d20: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
9d30: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
9d40: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
9d50: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
9d60: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
9d70: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
9d80: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c  CollSeq(db, pCol
9d90: 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  l, zName, nName)
9da0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
9db0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
9dc0: 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ame<0 ){.       
9dd0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
9de0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
9df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9e00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9e10: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
9e20: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
9e30: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
9e40: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
9e50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
9e60: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
9e70: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9e80: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
9e90: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
9ea0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
9eb0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
9ec0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
9ed0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
9ee0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
9ef0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9f00: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
9f10: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
9f20: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
9f30: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
9f40: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
9f50: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
9f60: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
9f70: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
9f80: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
9f90: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
9fa0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9fb0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
9fc0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
9fd0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
9fe0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
9ff0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
a000: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
a010: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
a020: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
a030: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
a040: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
a050: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
a060: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
a070: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
a080: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
a090: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
a0a0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
a0b0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
a0c0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
a0d0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
a0e0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
a0f0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
a100: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
a110: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
a120: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
a130: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
a140: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
a150: 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65  angeCookie(Parse
a160: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
a170: 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  b){.  int r1 = s
a180: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a190: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
a1a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a1b0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
a1c0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a1d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a1f0: 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  er, db->aDb[iDb]
a200: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
a210: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a  _cookie+1, r1);.
a220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a230: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
a240: 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 72 31 29  kie, iDb, 0, r1)
a250: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
a260: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
a270: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
a280: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
a290: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
a2a0: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
a2b0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
a2c0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
a2d0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
a2e0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
a2f0: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
a300: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
a310: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
a320: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
a330: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
a340: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
a350: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
a360: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
a370: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
a380: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
a390: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
a3a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
a3b0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
a3c0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
a3d0: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
a3e0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
a3f0: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
a400: 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69   Write an identi
a410: 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e  fier onto the en
a420: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73  d of the given s
a430: 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71  tring.  Add.** q
a440: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
a450: 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  as needed..*/.st
a460: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
a470: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
a480: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
a490: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
a4a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
a4b0: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
a4c0: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
a4d0: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
a4e0: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
a4f0: 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d   *pIdx;.  for(j=
a500: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a510: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
a520: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
a530: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
a540: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
a550: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49   needQuote =  zI
a560: 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73  dent[j]!=0 || is
a570: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
a580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a590: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
a5a0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
a5b0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
a5c0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a5d0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
a5e0: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a5f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
a600: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
a610: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
a620: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
a630: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
a640: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
a650: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
a660: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
a670: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
a680: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
a690: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
a6a0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
a6b0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
a6c0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
a6d0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
a6e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
a6f0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
a700: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a710: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
a720: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
a730: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
a740: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
a750: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
a760: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
a770: 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20  , int isTemp){. 
a780: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
a790: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
a7a0: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
a7b0: 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20  2, *zEnd, *z;.  
a7c0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
a7d0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
a7e0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
a7f0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
a800: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
a810: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
a820: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
a830: 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70    z = pCol->zTyp
a840: 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  e;.    if( z ){.
a850: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
a860: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
a870: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
a880: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
a890: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
a8a0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
a8b0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
a8c0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
a8d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
a8e0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
a8f0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
a900: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
a910: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
a920: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
a930: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
a940: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  3_malloc( n );. 
a950: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
a960: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
a970: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
a980: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
a990: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a9a0: 6e 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20  n, zStmt,.      
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 21 4f 4d 49              !OMI
a9c0: 54 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70  T_TEMPDB&&isTemp
a9d0: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
a9e0: 54 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20  TABLE ":"CREATE 
a9f0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
aa00: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
aa10: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
aa20: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
aa30: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
aa40: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
aa50: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
aa60: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
aa70: 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  l++){.    sqlite
aa80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
aa90: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
aaa0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65  ;.    k += strle
aab0: 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  n(&zStmt[k]);.  
aac0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
aad0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
aae0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
aaf0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  ame);.    if( (z
ab00: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21   = pCol->zType)!
ab10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  =0 ){.      zStm
ab20: 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  t[k++] = ' ';.  
ab30: 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
ab40: 65 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a  en(z)+k+1<=n );.
ab50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ab60: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
ab70: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 29 3b  mt[k], "%s", z);
ab80: 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  .      k += strl
ab90: 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  en(z);.    }.  }
aba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
abb0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
abc0: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
abd0: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
abe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
abf0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ac00: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
ac10: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
ac20: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
ac30: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ac40: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
ac50: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
ac60: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
ac70: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
ac80: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
ac90: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
aca0: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
acb0: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
acc0: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
acd0: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
ace0: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
acf0: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
ad00: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
ad10: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
ad20: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
ad30: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
ad40: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
ad50: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
ad60: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
ad70: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
ad80: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
ad90: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
ada0: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
adb0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
adc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
add0: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
ade0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
adf0: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
ae00: 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65   changed, so the
ae10: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
ae20: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
ae30: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
ae40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ae50: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
ae60: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
ae70: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
ae80: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
ae90: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
aea0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
aeb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
aec0: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
aed0: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
aee0: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
aef0: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
af00: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
af10: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
af20: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
af30: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
af40: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
af50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
af60: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
af70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
af80: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
af90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
afa0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
afb0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  t */.  Token *pC
afc0: 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ons,           /
afd0: 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20  * The ',' token 
afe0: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63  after the last c
aff0: 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20  olumn defn. */. 
b000: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
b010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b020: 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20  final ')' token 
b030: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
b040: 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  BLE */.  Select 
b050: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
b060: 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
b070: 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
b080: 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
b090: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
b0a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b0b0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
b0c0: 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  ;..  if( (pEnd==
b0d0: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
b0e0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
b0f0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
b100: 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 72 65 74  iled ) {.    ret
b110: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
b120: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b130: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b140: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
b150: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
b160: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
b170: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
b180: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
b190: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
b1a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b1b0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
b1c0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
b1d0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
b1e0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
b1f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
b200: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
b210: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b230: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
b240: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
b250: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
b260: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
b270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
b280: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
b290: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
b2a0: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
b2b0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
b2c0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
b2d0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
b2e0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
b2f0: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
b300: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
b310: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
b320: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
b330: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
b340: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
b350: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
b360: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
b370: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
b380: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
b390: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
b3a0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
b3b0: 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
b3c0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
b3d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
b3e0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b3f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b400: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
b410: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
b420: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
b430: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
b440: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
b450: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
b460: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
b470: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
b480: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
b490: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
b4a0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
b4b0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
b4c0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
b4d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b4e0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
b4f0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
b500: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
b510: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
b520: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
b530: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
b540: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
b550: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
b560: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
b570: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
b580: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
b590: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
b5a0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
b5b0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
b5c0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
b5d0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b5e0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
b5f0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
b600: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
b610: 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20  se.  The record 
b620: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b630: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e  the new table en
b640: 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  try should alrea
b650: 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61  dy be on the sta
b660: 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ck..  **.  ** If
b670: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
b680: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
b690: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
b6a0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
b6b0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
b6c0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
b6d0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
b6e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
b6f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
b700: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
b710: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
b720: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
b730: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
b740: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
b750: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
b760: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
b770: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
b780: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
b790: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
b7a0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
b7b0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
b7c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b7d0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
b7e0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
b7f0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
b800: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
b810: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
b820: 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
b830: 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65  tpage for the ne
b840: 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68  w table and push
b850: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61   it onto the sta
b860: 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65  ck..    ** A vie
b870: 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67  w has no rootpag
b880: 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20  e, so just push 
b890: 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20  a zero onto the 
b8a0: 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a  stack for.    **
b8b0: 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c   views.  Initial
b8c0: 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65  ize zType at the
b8d0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
b8e0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
b8f0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
b900: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
b910: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
b920: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
b930: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
b940: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
b950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
b960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b970: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
b980: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
b990: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
b9a0: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
b9b0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
b9c0: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
b9d0: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
b9e0: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
b9f0: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
ba00: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
ba10: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
ba20: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
ba30: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
ba40: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
ba50: 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74  ew table is on t
ba60: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64  he top of the vd
ba70: 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  be stack..    **
ba80: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
ba90: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
baa0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
bab0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
bac0: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
bad0: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
bae0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
baf0: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
bb00: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
bb10: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
bb20: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
bb30: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
bb40: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
bb50: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
bb60: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
bb70: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
bb80: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
bb90: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
bba0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
bbb0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
bbc0: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
bbd0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
bbe0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
bbf0: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
bc00: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
bc10: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
bc20: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
bc30: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
bc40: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
bc50: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
bc60: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
bc70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bc80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
bc90: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
bca0: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
bcb0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
bcc0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
bcd0: 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   1);.      pPars
bce0: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
bcf0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
bd00: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
bd10: 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20  SRT_Table, 1);. 
bd20: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
bd30: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
bd40: 63 74 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c  ct, &dest, 0, 0,
bd50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
bd60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bd70: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
bd80: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
bd90: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
bda0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
bdb0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
bdc0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
bdd0: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
bde0: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
bdf0: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
be00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
be10: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
be20: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
be30: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
be40: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
be50: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
be60: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
be70: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
be80: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
be90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
bea0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
beb0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
bec0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
bed0: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
bee0: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
bef0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
bf00: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
bf10: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
bf20: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
bf30: 65 53 74 6d 74 28 64 62 2c 20 70 2c 20 70 2d 3e  eStmt(db, p, p->
bf40: 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
bf50: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
bf60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
bf70: 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61   = pEnd->z - pPa
bf80: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
bf90: 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  z + 1;.      zSt
bfa0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
bfb0: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
bfc0: 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
bfd0: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
bfe0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
bff0: 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
c000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
c010: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
c020: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
c030: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
c040: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
c050: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
c060: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
c070: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
c080: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
c090: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
c0a0: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
c0b0: 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66  ed.  The rowid f
c0c0: 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61  or the prealloca
c0d0: 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  ted.    ** slot 
c0e0: 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20  is the 2nd item 
c0f0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
c100: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
c110: 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ack is the.    *
c120: 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  * root page for 
c130: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f  the new table (o
c140: 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73  r a 0 if this is
c150: 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f   a view)..    */
c160: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
c170: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
c180: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
c190: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
c1a0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
c1b0: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
c1c0: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
c1d0: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
c1e0: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
c1f0: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
c200: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
c210: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
c220: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
c230: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
c240: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
c250: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
c260: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
c270: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
c280: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
c290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
c2a0: 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  ee(zStmt);.    s
c2b0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
c2c0: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
c2d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c2e0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
c2f0: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
c300: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
c310: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
c320: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
c330: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
c340: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
c350: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
c360: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
c370: 20 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20   if( p->autoInc 
c380: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
c390: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
c3a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
c3b0: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
c3c0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
c3d0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
c3e0: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
c3f0: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
c400: 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
c410: 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
c420: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
c430: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  >zName.        )
c440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c450: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
c460: 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
c470: 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
c480: 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
c490: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
c4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c4b0: 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(v, OP_ParseSch
c4c0: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a  ema, iDb, 0, 0,.
c4d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
c4e0: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
c4f0: 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e  name='%q'",p->zN
c500: 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43  ame), P4_DYNAMIC
c510: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
c520: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
c530: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
c540: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
c550: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
c560: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
c570: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
c580: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
c590: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
c5a0: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20   FKey *pFKey; . 
c5b0: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
c5c0: 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
c5d0: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
c5e0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c5f0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
c600: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
c610: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29  n(p->zName)+1,p)
c620: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
c630: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c640: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
c650: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
c660: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
c670: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
c680: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
c690: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
c6a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
c6b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c6c0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
c6d0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
c6e0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
c6f0: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
c700: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  rom){.      void
c710: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 69 6e   *data;.      in
c720: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
c730: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
c740: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
c750: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
c760: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
c770: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
c780: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
c790: 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 48 61  data = sqlite3Ha
c7a0: 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
c7b0: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  a->aFKey, pFKey-
c7c0: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79  >zTo, nTo, pFKey
c7d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 61 74  );.      if( dat
c7e0: 61 3d 3d 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  a==(void *)pFKey
c7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
c800: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c820: 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
c830: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
c840: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
c850: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
c860: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
c870: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
c880: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c890: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
c8a0: 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
c8b0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
c8c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
c8d0: 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
c8e0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
c8f0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
c900: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
c910: 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
c920: 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
c930: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
c940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
c950: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
c960: 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
c970: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
c980: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b  Cons->z - zName;
c990: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
c9a0: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
c9b0: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
c9c0: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
c9d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c9e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c9f0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
ca00: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
ca10: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
ca20: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
ca30: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
ca40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
ca50: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
ca60: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
ca70: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
ca80: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ca90: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
caa0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
cab0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
cac0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
cad0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
cae0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
caf0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
cb00: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
cb10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
cb20: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
cb30: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
cb40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cb50: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
cb60: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
cb70: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
cb80: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
cb90: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
cba0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
cbb0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
cbc0: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
cbd0: 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
cbe0: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
cbf0: 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
cc00: 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
cc10: 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
cc20: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
cc30: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
cc40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
cc50: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
cc60: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
cc70: 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
cc80: 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  me;.  int iDb;. 
cc90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cca0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
ccb0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
ccc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ccd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
cce0: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
ccf0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
cd00: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
cd10: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
cd20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
cd30: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
cd40: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
cd50: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
cd60: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
cd70: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
cd80: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
cd90: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
cda0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
cdb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
cdc0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
cdd0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
cde0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
cdf0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
ce00: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
ce10: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
ce20: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
ce30: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
ce40: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
ce50: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
ce60: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
ce70: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
ce80: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
ce90: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
cea0: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
ceb0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
cec0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
ced0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cee0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
cef0: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
cf00: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cf10: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
cf20: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
cf30: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
cf40: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
cf50: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
cf60: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
cf70: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
cf80: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
cf90: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
cfa0: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
cfb0: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
cfc0: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
cfd0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
cfe0: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
cff0: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
d000: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
d010: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
d020: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  , pSelect);.  sq
d030: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d040: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
d050: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d060: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
d070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
d080: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
d090: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
d0a0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
d0b0: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
d0c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
d0d0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
d0e0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
d0f0: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
d100: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
d110: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
d120: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
d130: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
d140: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
d150: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
d160: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
d170: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
d180: 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20  0;.  n = sEnd.z 
d190: 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  - pBegin->z;.  z
d1a0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
d1b0: 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d  ed char*)pBegin-
d1c0: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
d1d0: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
d1e0: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
d1f0: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
d200: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
d210: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
d220: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
d230: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
d240: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
d250: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
d260: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
d270: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
d280: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
d290: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
d2a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d2b0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
d2c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d2d0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
d2e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d2f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d300: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
d310: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
d320: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
d330: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
d340: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
d350: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
d360: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
d370: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
d380: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d390: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
d3a0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
d3b0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
d3c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d3d0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
d3e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d3f0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
d400: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d410: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
d420: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
d430: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
d440: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
d450: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
d460: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
d470: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
d480: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
d490: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
d4a0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
d4b0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
d4c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d4d0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
d4e0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
d4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
d500: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
d510: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
d520: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
d530: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d540: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
d550: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d560: 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
d570: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
d580: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
d590: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
d5a0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d5b0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d5c0: 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r*);..  assert( 
d5d0: 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
d5e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d5f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
d600: 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  ( sqlite3VtabCal
d610: 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
d620: 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20   pTable) ){.    
d630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
d640: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  ROR;.  }.  if( I
d650: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
d660: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
d670: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
d680: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
d690: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
d6a0: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
d6b0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
d6c0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
d6d0: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
d6e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
d6f0: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
d700: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
d710: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
d720: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
d730: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
d740: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
d750: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
d760: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
d770: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
d780: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
d790: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
d7a0: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
d7b0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
d7c0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
d7d0: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
d7e0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
d7f0: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
d800: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
d810: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
d820: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
d830: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
d840: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
d850: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
d860: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
d870: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
d880: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
d890: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
d8a0: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
d8b0: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
d8c0: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
d8d0: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
d8e0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
d8f0: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
d900: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d910: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
d920: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
d930: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
d940: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
d950: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d960: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20  pTable->nCol>=0 
d970: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  );..  /* If we g
d980: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
d990: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
d9a0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
d9b0: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
d9c0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
d9d0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
d9e0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
d9f0: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
da00: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
da10: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
da20: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
da30: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
da40: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
da50: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
da60: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
da70: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
da80: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
da90: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
daa0: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
dab0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
dac0: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
dad0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
dae0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
daf0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
db00: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
db10: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
db20: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
db30: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
db40: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
db50: 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ect);.  if( pSel
db60: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
db70: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
db80: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
db90: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
dba0: 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
dbb0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
dbc0: 3d 20 2d 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  = -1;.#ifndef SQ
dbd0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
dbe0: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74  IZATION.    xAut
dbf0: 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
dc00: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
dc10: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
dc20: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
dc30: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
dc40: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64   0, pSel);.    d
dc50: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
dc60: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
dc70: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
dc80: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
dc90: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
dca0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
dcb0: 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
dcc0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
dcd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dce0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
dcf0: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
dd00: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
dd10: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
dd20: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
dd30: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
dd40: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
dd50: 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
dd60: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
dd70: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
dd80: 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20  able(pSelTab);. 
dd90: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63       pTable->pSc
dda0: 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44  hema->flags |= D
ddb0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
ddc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ddd0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
dde0: 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
ddf0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
de00: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
de10: 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Sel);.  } else {
de20: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
de30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
de40: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
de50: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
de60: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
de70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
de80: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
de90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
dea0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
deb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dec0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
ded0: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
dee0: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
def0: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
df00: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
df10: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
df20: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
df30: 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
df40: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
df50: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
df60: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
df70: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
df80: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
df90: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
dfa0: 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
dfb0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
dfc0: 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
dfd0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
dfe0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
dff0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
e000: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
e010: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
e020: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
e030: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
e040: 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
e050: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e060: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e070: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
e080: 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
e090: 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
e0a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e0b0: 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
e0c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e0d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
e0e0: 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
e0f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
e100: 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
e110: 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
e120: 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
e130: 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
e140: 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
e150: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
e160: 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
e170: 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
e180: 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
e190: 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
e1a0: 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
e1b0: 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
e1c0: 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
e1d0: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
e1e0: 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
e1f0: 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
e200: 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
e210: 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
e220: 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
e230: 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
e240: 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
e250: 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
e260: 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
e270: 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
e280: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
e290: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
e2a0: 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
e2b0: 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
e2c0: 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
e2d0: 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
e2e0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
e2f0: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
e300: 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
e310: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
e320: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
e330: 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
e340: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
e350: 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
e360: 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
e370: 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
e380: 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
e390: 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
e3a0: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
e3b0: 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
e3c0: 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
e3d0: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
e3e0: 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
e3f0: 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
e400: 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
e410: 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
e420: 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
e430: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e440: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
e450: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
e460: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
e470: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
e480: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
e490: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
e4a0: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
e4b0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
e4c0: 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
e4d0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
e4e0: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
e4f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
e500: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
e510: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e520: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
e530: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
e540: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
e550: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
e560: 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
e570: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
e580: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
e590: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
e5a0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
e5b0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
e5c0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
e5d0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
e5e0: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
e5f0: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
e600: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
e610: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
e620: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
e630: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
e640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
e650: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
e660: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
e670: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
e680: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
e690: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
e6a0: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
e6b0: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
e6c0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e6d0: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
e6e0: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
e6f0: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
e700: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
e710: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
e720: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
e730: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
e740: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
e750: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
e760: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
e770: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
e780: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
e790: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
e7a0: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
e7b0: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
e7c0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
e7d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
e7e0: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
e7f0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
e800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
e810: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
e820: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
e830: 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20  , iDb);.#ifndef 
e840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e850: 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
e860: 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
e870: 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
e880: 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
e890: 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
e8a0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
e8b0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
e8c0: 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
e8d0: 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
e8e0: 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
e8f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
e900: 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
e910: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e920: 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
e930: 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
e940: 54 68 65 20 22 23 25 64 22 20 69 6e 20 74 68 65  The "#%d" in the
e950: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
e960: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
e970: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
e980: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20  alue.  ** is on 
e990: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
e9a0: 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74  tack.  See sqlit
e9b0: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 29  e3RegisterExpr()
e9c0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
e9d0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
e9e0: 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
e9f0: 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
ea00: 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
ea10: 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
ea20: 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
ea30: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
ea40: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
ea50: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c  LE(iDb), iTable,
ea60: 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
ea70: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
ea80: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ea90: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
eaa0: 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
eab0: 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
eac0: 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
ead0: 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
eae0: 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
eaf0: 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
eb00: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
eb10: 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
eb20: 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
eb30: 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
eb40: 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
eb50: 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
eb60: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
eb70: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
eb80: 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
eb90: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
eba0: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
ebb0: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
ebc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ebd0: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
ebe0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
ebf0: 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66  e *pTab){.#ifdef
ec00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ec10: 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20  OVACUUM.  Index 
ec20: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62  *pIdx;.  int iDb
ec30: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
ec40: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
ec50: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
ec60: 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f  a);.  destroyRoo
ec70: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54  tPage(pParse, pT
ec80: 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ab->tnum, iDb);.
ec90: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
eca0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
ecb0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ecc0: 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  {.    destroyRoo
ecd0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
ece0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
ecf0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49    }.#else.  /* I
ed00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
ed10: 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
ed20: 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
ed30: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ed40: 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
ed50: 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
ed60: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
ed70: 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
ed80: 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
ed90: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
eda0: 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
edb0: 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
edc0: 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
edd0: 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
ede0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
edf0: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
ee00: 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
ee10: 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
ee20: 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
ee30: 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
ee40: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
ee50: 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
ee60: 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
ee70: 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
ee80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
ee90: 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
eea0: 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
eeb0: 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
eec0: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
eed0: 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
eee0: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
eef0: 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
ef00: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
ef10: 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
ef20: 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
ef30: 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
ef40: 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
ef50: 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
ef60: 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
ef70: 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
ef80: 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
ef90: 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
efa0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
efb0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
efc0: 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
efd0: 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
efe0: 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
eff0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
f000: 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
f010: 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
f020: 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
f030: 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
f040: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
f050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
f060: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f070: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f080: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f090: 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
f0a0: 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
f0b0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
f0c0: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f0d0: 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
f0e0: 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
f0f0: 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
f100: 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
f110: 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
f120: 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
f130: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
f140: 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
f150: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
f160: 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
f170: 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
f180: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f190: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f1a0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f1b0: 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
f1c0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f1d0: 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
f1e0: 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
f1f0: 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
f200: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
f210: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f220: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f230: 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
f240: 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
f250: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
f260: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
f270: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
f280: 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
f290: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
f2a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f2b0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
f2c0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
f2d0: 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
f2e0: 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
f2f0: 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
f300: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
f310: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
f320: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
f330: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f340: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
f350: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f360: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
f370: 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
f380: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
f390: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
f3a0: 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20  e, isView, .    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61          pName->a
f3d0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f3e0: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f3f0: 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
f400: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
f410: 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
f420: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
f430: 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
f440: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f450: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
f460: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f470: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
f480: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
f490: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
f4a0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
f4b0: 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
f4c0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
f4d0: 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
f4e0: 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
f4f0: 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
f500: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
f510: 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
f520: 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
f530: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
f540: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
f550: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
f560: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f570: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
f580: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
f590: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
f5a0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
f5b0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
f5c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f5d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f5e0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
f5f0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
f600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
f610: 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
f620: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f630: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
f640: 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
f650: 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
f660: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f670: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f680: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
f690: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f6a0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
f6b0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f6c0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
f6d0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
f6e0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
f6f0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
f700: 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
f710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f720: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
f730: 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
f740: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
f750: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
f760: 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
f770: 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62      zArg2 = pTab
f780: 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
f790: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
f7a0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
f7b0: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
f7c0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
f7d0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f7e0: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
f7f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f800: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f810: 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
f820: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f830: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
f840: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
f850: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
f860: 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
f870: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f880: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
f890: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f8a0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f8b0: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
f8c0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
f8d0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
f8e0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f900: 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  if.  if( pTab->r
f910: 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d  eadOnly || pTab=
f920: 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  =db->aDb[iDb].pS
f930: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 29  chema->pSeqTab )
f940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f950: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
f960: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
f970: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
f980: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
f990: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f9a0: 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
f9b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f9c0: 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
f9d0: 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
f9e0: 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
f9f0: 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
fa00: 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
fa10: 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
fa20: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
fa30: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
fa40: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fa50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fa60: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
fa70: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
fa80: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
fa90: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
faa0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fab0: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
fac0: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
fad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
fae0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
faf0: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
fb00: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
fb10: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
fb20: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
fb30: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
fb40: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
fb50: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
fb60: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
fb70: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
fb80: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
fb90: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
fba0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
fbb0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
fbc0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
fbd0: 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70  igger;.    Db *p
fbe0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
fbf0: 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  b];.    sqlite3B
fc00: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
fc10: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
fc20: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
fc30: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
fc40: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
fc50: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
fc60: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
fc70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
fc80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
fc90: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20  f( v ){.        
fca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fcb0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
fcc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
fcd0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
fce0: 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
fcf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
fd00: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
fd10: 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
fd20: 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
fd30: 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
fd40: 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
fd50: 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
fd60: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
fd70: 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
fd80: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
fd90: 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d  pTrigger = pTab-
fda0: 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77  >pTrigger;.    w
fdb0: 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
fdc0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
fdd0: 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
fde0: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
fdf0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
fe00: 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
fe10: 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
fe20: 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
fe30: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
fe40: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
fe50: 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72  gger);.      pTr
fe60: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
fe70: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
fe80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe90: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
fea0: 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
feb0: 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
fec0: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
fed0: 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
fee0: 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
fef0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
ff00: 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
ff10: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
ff20: 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
ff30: 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
ff40: 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
ff50: 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
ff60: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
ff70: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
ff80: 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
ff90: 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
ffa0: 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
ffb0: 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
ffc0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
ffd0: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
ffe0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
fff0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10000 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10010 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65  ROM %s.sqlite_se
10020 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
10030 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70  e=%Q",.        p
10040 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
10050 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
10060 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
10070 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
10080 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10090 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
100a0 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
100b0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62  o the.    ** tab
100c0 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
100d0 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
100e0 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
100f0 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
10100 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77      ** every row
10110 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10120 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
10130 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
10140 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a  one being.    **
10150 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
10160 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
10170 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73  eperately becaus
10180 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
10190 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  be.    ** create
101a0 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
101b0 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
101c0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
101d0 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
101e0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
101f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
10200 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
10210 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
10220 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
10230 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
10240 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
10250 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d  '",.        pDb-
10260 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
10270 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
10280 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
10290 20 44 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73   Drop any statis
102a0 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71  tics from the sq
102b0 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65  lite_stat1 table
102c0 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  , if it exists *
102d0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
102e0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
102f0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64  sqlite_stat1", d
10300 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
10310 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
10320 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10330 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10340 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
10350 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
10360 45 20 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e  E tbl=%Q", pDb->
10370 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
10380 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
10390 7d 0a 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  }..    if( !isVi
103a0 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
103b0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
103c0 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
103d0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
103e0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
103f0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
10400 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
10410 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
10420 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
10430 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
10440 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ie..    */.    i
10450 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10460 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
10470 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10480 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
10490 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
104a0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
104b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
104c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
104d0 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
104e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
104f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
10500 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10510 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  e, iDb);.  }.  s
10520 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
10530 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
10540 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
10550 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
10560 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
10570 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10580 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10590 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
105a0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
105b0 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
105c0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
105d0 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
105e0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
105f0 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
10600 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10610 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
10620 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
10630 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
10640 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
10650 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
10660 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
10670 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
10680 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
10690 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
106a0 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
106b0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
106c0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
106d0 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
106e0 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
106f0 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
10700 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
10710 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10720 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
10730 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
10740 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
10750 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
10760 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
10770 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
10780 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
10790 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
107a0 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
107b0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
107c0 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
107d0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
107e0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
107f0 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
10800 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
10810 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
10820 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
10830 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
10840 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
10850 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
10860 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
10870 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
10880 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
10890 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
108a0 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
108b0 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
108c0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
108d0 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
108e0 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
108f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10900 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
10910 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
10920 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
10930 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10940 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
10950 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
10960 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
10970 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
10980 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
10990 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
109a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
109b0 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
109c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
109d0 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
109e0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
109f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
10a00 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
10a10 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
10a20 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
10a30 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ms. */.){.#ifnde
10a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
10a50 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
10a60 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54   *pFKey = 0;.  T
10a70 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
10a80 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
10a90 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
10aa0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
10ab0 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
10ac0 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
10ad0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10ae0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f  rse->nErr || IN_
10af0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
10b00 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
10b10 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
10b20 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
10b30 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
10b40 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
10b50 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
10b60 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10b70 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
10b80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10b90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
10ba0 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
10bb0 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
10bc0 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
10bd0 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
10be0 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
10bf0 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
10c00 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
10c10 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
10c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
10c30 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
10c40 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
10c50 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
10c60 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
10c70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10c80 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10c90 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
10ca0 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
10cb0 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
10cc0 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
10cd0 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
10ce0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
10cf0 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
10d00 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
10d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
10d20 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
10d30 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
10d40 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
10d50 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
10d60 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
10d70 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
10d80 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
10d90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
10da0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
10db0 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
10dc0 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
10dd0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
10de0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
10df0 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
10e00 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
10e10 3e 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  >db, nByte );.  
10e20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
10e30 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
10e40 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
10e50 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
10e60 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
10e70 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
10e80 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
10e90 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
10ea0 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
10eb0 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
10ec0 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
10ed0 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
10ee0 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
10ef0 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
10f00 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
10f10 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
10f20 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
10f30 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
10f40 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
10f50 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
10f60 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
10f70 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
10f80 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
10f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
10fa0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
10fb0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
10fc0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
10fd0 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
10fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
10ff0 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
11000 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
11010 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
11020 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
11030 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11040 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
11050 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11070 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
11080 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
11090 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
110a0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
110b0 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
110c0 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
110d0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
110e0 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
110f0 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
11100 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
11110 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11130 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
11140 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11150 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11160 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
11170 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11180 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
11190 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
111a0 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
111b0 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
111c0 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
111d0 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
111e0 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
111f0 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
11200 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
11210 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
11220 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
11230 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
11240 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
11250 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
11260 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
11270 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
11280 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
11290 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
112a0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
112b0 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
112c0 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
112d0 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
112e0 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
112f0 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  end:.  sqlite3_f
11300 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64  ree(pFKey);.#end
11310 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
11320 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11330 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
11340 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11350 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
11360 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11370 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
11380 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11390 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
113a0 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
113b0 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
113c0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
113d0 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
113e0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
113f0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11400 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
11410 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
11420 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
11430 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
11440 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
11450 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
11460 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
11470 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
11480 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
11490 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
114a0 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
114b0 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
114c0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
114d0 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
114e0 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
114f0 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
11500 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11510 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
11520 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
11530 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
11540 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11550 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
11560 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
11570 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46  0 ) return;.  pF
11580 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
11590 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  = isDeferred;.#e
115a0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
115b0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
115c0 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
115d0 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
115e0 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
115f0 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
11600 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
11610 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
11620 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
11630 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
11640 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
11650 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
11660 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
11670 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
11680 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
11690 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
116a0 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
116b0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
116c0 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
116d0 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
116e0 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
116f0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
11700 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
11710 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
11720 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
11730 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
11740 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
11750 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
11760 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
11770 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
11780 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
11790 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
117a0 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
117b0 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
117c0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
117d0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
117e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
117f0 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
11800 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
11810 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
11820 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
11830 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
11840 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
11850 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
11860 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20  se->nTab;       
11870 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
11880 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
11890 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
118a0 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20  arse->nTab+1;   
118b0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
118c0 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
118d0 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  x */.  int addr1
118e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
118f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11900 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
11910 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11940 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56   of index */.  V
11950 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11970 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
11980 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
11990 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
119a0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
119c0 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
119d0 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64  x */.  int regId
119e0 78 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  xKey;           
119f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
11a00 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  rs containing th
11a10 65 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  e index key */. 
11a20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
11a50 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69  ing assemblied i
11a60 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
11a70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11a80 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
11a90 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
11aa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
11ab0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
11ac0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
11ad0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
11ae0 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
11af0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
11b00 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
11b10 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11b20 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
11b30 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
11b40 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
11b50 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
11b60 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
11b70 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
11b80 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
11b90 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
11ba0 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
11bb0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
11bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
11bd0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
11be0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
11bf0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
11c00 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
11c10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11c20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
11c30 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
11c40 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
11c50 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
11c60 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
11c70 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
11c80 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  tnum;.    sqlite
11c90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11ca0 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
11cb0 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20  Db);.  }.  pKey 
11cc0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
11cd0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
11ce0 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
11cf0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11d00 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
11d10 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
11d40 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
11d50 46 46 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  FF);.  if( memRo
11d60 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
11d70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11d80 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a  geP5(v, 1);.  }.
11d90 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
11da0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
11db0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
11dc0 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
11dd0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
11de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
11df0 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
11e00 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
11e10 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11e20 61 72 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b  arse);.  regIdxK
11e30 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  ey = sqlite3Gene
11e40 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
11e50 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  rse, pIndex, iTa
11e60 62 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29  b, regRecord, 1)
11e70 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  ;.  if( pIndex->
11e80 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
11e90 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
11ea0 6a 32 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 52  j2;.    int regR
11eb0 6f 77 69 64 3b 0a 0a 20 20 20 20 72 65 67 52 6f  owid;..    regRo
11ec0 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20  wid = regIdxKey 
11ed0 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  + pIndex->nColum
11ee0 6e 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  n;.    j1 = sqli
11ef0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11f00 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 49   OP_IsNull, regI
11f10 64 78 4b 65 79 2c 20 30 2c 20 70 49 6e 64 65 78  dxKey, 0, pIndex
11f20 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->nColumn);.    
11f30 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
11f40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
11f50 6e 69 71 75 65 2c 20 69 49 64 78 2c 0a 20 20 20  nique, iIdx,.   
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 20 20 20 20 20 30 2c 20 72 65 67 52 6f          0, regRo
11f80 77 69 64 2c 20 28 63 68 61 72 2a 29 72 65 67 52  wid, (char*)regR
11f90 65 63 6f 72 64 2c 20 50 34 5f 49 4e 54 33 32 29  ecord, P4_INT32)
11fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11fb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
11fc0 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
11fd0 52 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c  RAINT, OE_Abort,
11fe0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11ff0 20 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64          "indexed
12000 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74   columns are not
12010 20 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41   unique", P4_STA
12020 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
12030 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12040 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
12050 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12060 20 6a 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   j2);.  }.  sqli
12070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12080 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
12090 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
120a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
120b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
120c0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
120d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
120e0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
120f0 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73  b, addr1+1);.  s
12100 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12110 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
12120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12130 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
12140 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Tab);.  sqlite3V
12150 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12160 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a  Close, iIdx);.}.
12170 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
12180 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
12190 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
121a0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
121b0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
121c0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
121d0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
121e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
121f0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
12200 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
12210 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
12220 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
12230 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
12240 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
12250 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
12260 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
12270 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
12280 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
12290 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
122a0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
122b0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
122c0 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
122d0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
122e0 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
122f0 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
12300 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
12310 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
12320 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
12330 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
12340 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
12350 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
12360 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
12370 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
12380 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
12390 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
123a0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
123b0 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
123c0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
123d0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
123e0 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
123f0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
12400 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
12410 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
12420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
12430 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
12440 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
12450 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
12460 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
12470 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
12480 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
12490 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
124a0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
124b0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
124c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
124d0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
124e0 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
124f0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12500 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
12510 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
12520 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
12530 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
12540 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
12550 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
12560 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
12570 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
12580 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
12590 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
125a0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
125b0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
125c0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
125d0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
125e0 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  ,       /* The "
125f0 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74  )" that closes t
12600 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
12610 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
12620 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
12630 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
12640 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
12650 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
12660 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
12670 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
12680 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
12690 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
126a0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
126b0 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
126c0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
126d0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
126e0 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
126f0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
12700 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
12710 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
12720 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12730 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
12740 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
12750 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
12760 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
12770 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
12780 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
12790 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
127a0 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
127b0 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
127c0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
127d0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
127e0 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
127f0 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
12800 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
12810 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
12820 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
12830 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
12840 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
12850 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12860 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
12870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12880 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
12890 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
128a0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
128b0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
128c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
128d0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
128e0 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
128f0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
12900 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
12910 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
12920 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12930 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
12940 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
12950 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
12960 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
12970 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
12980 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
12990 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
129a0 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20  char *zExtra;.. 
129b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
129c0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
129d0 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
129e0 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
129f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12a00 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
12a10 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
12a20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
12a30 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
12a40 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
12a50 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
12a60 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
12a70 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
12a80 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
12a90 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
12aa0 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
12ab0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
12ac0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
12ad0 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
12ae0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
12af0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
12b00 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
12b10 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
12b20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
12b30 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
12b40 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
12b50 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
12b60 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
12b70 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
12b80 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
12b90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12ba0 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
12bb0 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
12bc0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
12bd0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
12be0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
12bf0 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
12c00 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
12c10 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
12c20 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
12c30 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
12c40 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
12c50 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
12c60 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
12c70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
12c80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
12c90 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
12ca0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
12cb0 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
12cc0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
12cd0 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
12ce0 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
12cf0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
12d00 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
12d10 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
12d20 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
12d30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
12d40 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
12d50 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
12d60 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
12d70 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20   pName) &&.     
12d80 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63     sqlite3FixSrc
12d90 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
12da0 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  Name).    ){.   
12db0 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
12dc0 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
12dd0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
12de0 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
12df0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
12e00 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
12e10 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
12e20 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
12e30 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
12e40 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
12e50 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
12e60 2c 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  , 0, pTblName->a
12e70 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
12e80 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
12e90 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
12ea0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
12eb0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12ec0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
12ed0 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
12ee0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
12ef0 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73  Schema );.  }els
12f00 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
12f10 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
12f20 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
12f30 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
12f40 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
12f50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12f60 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
12f70 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12f80 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
12f90 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
12fa0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
12fb0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
12fc0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
12fd0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12fe0 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54  _index;.  if( pT
12ff0 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  ab->readOnly ){.
13000 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13010 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
13020 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
13030 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
13040 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
13050 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13060 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
13070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13080 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
13090 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
130a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
130b0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
130c0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
130d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
130e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
130f0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
13100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13110 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
13120 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
13130 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13140 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13150 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
13160 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
13170 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
13180 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13190 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
131a0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
131b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
131c0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
131d0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
131e0 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
131f0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
13200 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
13210 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
13220 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
13230 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
13240 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
13250 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
13260 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
13270 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
13280 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
13290 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
132a0 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
132b0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
132c0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
132d0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
132e0 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
132f0 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
13300 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
13310 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
13320 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
13330 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
13340 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
13350 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
13360 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
13370 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
13380 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
13390 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
133a0 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
133b0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
133c0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
133d0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
133e0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
133f0 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
13400 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13410 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
13420 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
13430 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13440 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  dex;.    if( zNa
13450 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
13460 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13470 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
13480 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
13490 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
134a0 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
134b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
134c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
134d0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
134e0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
134f0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13500 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
13510 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
13520 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13530 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  x;.      if( sql
13540 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
13550 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
13560 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13570 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13580 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
13590 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
135a0 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
135b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
135c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
135d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
135e0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
135f0 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
13600 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20   pDb->zName)!=0 
13610 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66  ){.      if( !if
13620 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
13630 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13640 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
13650 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
13660 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
13670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
13680 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13690 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  dex;.    }.  }el
136a0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
136b0 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
136c0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
136d0 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
136e0 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
136f0 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
13700 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
13710 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  n++){}.    sqlit
13720 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
13730 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 5f  of(zBuf),zBuf,"_
13740 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  %d",n);.    zNam
13750 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
13760 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
13770 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
13780 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a  index_", pTab->z
13790 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61  Name, zBuf, (cha
137a0 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  r*)0);.    if( z
137b0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
137c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
137d0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  d = 1;.      got
137e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
137f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
13800 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
13810 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
13820 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
13830 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
13840 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
13850 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
13860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
13870 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
13880 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13890 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
138a0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
138b0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
138c0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
138d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
138e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
138f0 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
13900 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
13910 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
13920 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
13930 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
13940 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
13950 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
13960 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
13970 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
13980 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
13990 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
139a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
139b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
139c0 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
139d0 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
139e0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
139f0 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
13a00 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
13a10 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
13a20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
13a30 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
13a40 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
13a50 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
13a60 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
13a70 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
13a80 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
13a90 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29  nullId.z = (u8*)
13aa0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
13ab0 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
13ac0 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
13ad0 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c  trlen((char*)nul
13ae0 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
13af0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
13b00 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
13b10 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29  , 0, 0, &nullId)
13b20 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
13b30 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
13b40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13b50 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
13b60 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
13b70 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
13b80 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
13b90 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
13ba0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
13bb0 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
13bc0 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
13bd0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13be0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
13bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
13c00 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
13c10 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
13c20 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
13c30 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
13c40 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  xpr ){.      nEx
13c50 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c  tra += (1 + strl
13c60 65 6e 28 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  en(pExpr->pColl-
13c70 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
13c80 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
13c90 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
13ca0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
13cb0 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74   */.  nName = st
13cc0 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  rlen(zName);.  n
13cd0 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
13ce0 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  pr;.  pIndex = s
13cf0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
13d00 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69  ro(db, .      si
13d10 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20  zeof(Index) +   
13d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13d30 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a  dex structure  *
13d40 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69  /.      sizeof(i
13d50 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  nt)*nCol +      
13d60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
13d70 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
13d80 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e    sizeof(int)*(n
13d90 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f  Col+1) +       /
13da0 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  * Index.aiRowEst
13db0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
13dc0 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20  of(char *)*nCol 
13dd0 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  +        /* Inde
13de0 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
13df0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
13e00 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
13e10 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
13e20 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20  tOrder */.      
13e30 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  nName + 1 +     
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e50 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20  Index.zName     
13e60 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61   */.      nExtra
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
13e90 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
13ea0 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  es */.  );.  if(
13eb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13ec0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
13ed0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13ee0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61  .  }.  pIndex->a
13ef0 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
13f00 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20  (&pIndex[1]);.  
13f10 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
13f20 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64   = (int *)(&pInd
13f30 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d  ex->azColl[nCol]
13f40 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52  );.  pIndex->aiR
13f50 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
13f60 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  d *)(&pIndex->ai
13f70 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20  Column[nCol]);. 
13f80 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
13f90 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49  der = (u8 *)(&pI
13fa0 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e  ndex->aiRowEst[n
13fb0 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  Col+1]);.  pInde
13fc0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
13fd0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
13fe0 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
13ff0 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
14000 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
14010 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
14020 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
14030 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
14040 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
14050 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
14060 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
14070 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
14080 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
14090 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
140a0 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
140b0 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
140c0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
140d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
140e0 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
140f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
14100 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
14110 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
14120 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
14130 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
14140 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
14150 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
14160 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
14170 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
14180 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
14190 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
141a0 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
141b0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
141c0 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
141d0 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
141e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
141f0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
14200 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
14210 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
14220 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
14230 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
14240 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
14250 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
14260 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
14270 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
14280 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
14290 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
142a0 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
142b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
142c0 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
142d0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
142e0 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
142f0 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
14300 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
14310 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
14340 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
14350 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61      for(j=0, pTa
14360 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
14370 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
14380 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  ++, pTabCol++){.
14390 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
143a0 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d  3StrICmp(zColNam
143b0 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d  e, pTabCol->zNam
143c0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
143d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
143e0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
143f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14400 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
14410 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
14420 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
14430 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
14440 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20  me, zColName);. 
14450 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14460 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14470 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20   }.    /* TODO: 
14480 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
14490 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
144a0 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
144b0 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a   not named.    *
144c0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
144d0 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
144e0 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
144f0 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
14500 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
14510 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
14520 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
14530 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
14540 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
14550 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d     ** same colum
14560 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
14570 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
14580 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
14590 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62   would .    ** b
145a0 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
145b0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
145c0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
145d0 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  warning..    */.
145e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
145f0 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
14600 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
14610 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
14620 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
14630 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29  ->pExpr->pColl )
14640 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
14650 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 71  zExtra;.      sq
14660 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
14670 45 78 74 72 61 2c 20 7a 45 78 74 72 61 2c 20 22  Extra, zExtra, "
14680 25 73 22 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e  %s", pListItem->
14690 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e  pExpr->pColl->zN
146a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78 74  ame);.      zExt
146b0 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43  ra += (strlen(zC
146c0 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  oll) + 1);.    }
146d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
146e0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
146f0 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
14700 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !zColl ){.   
14710 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d       zColl = db-
14720 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >pDfltColl->zNam
14730 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
14740 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
14750 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
14760 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
14770 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20  (pParse, zColl, 
14780 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  -1) ){.      got
14790 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
147a0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
147b0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
147c0 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
147d0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
147e0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
147f0 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
14800 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
14810 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
14820 69 5d 20 3d 20 72 65 71 75 65 73 74 65 64 53 6f  i] = requestedSo
14830 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73  rtOrder;.  }.  s
14840 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
14850 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  Est(pIndex);..  
14860 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
14870 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
14880 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
14890 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
148a0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
148b0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
148c0 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
148d0 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
148e0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
148f0 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
14900 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
14910 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
14920 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
14930 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
14940 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
14950 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
14960 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
14970 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
14980 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
14990 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
149a0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
149b0 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
149c0 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
149d0 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
149e0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
149f0 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
14a00 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
14a10 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
14a20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
14a30 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
14a40 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
14a50 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
14a60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
14a70 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
14a80 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
14a90 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
14aa0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
14ab0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
14ac0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
14ad0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
14ae0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
14af0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
14b00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
14b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14b20 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
14b30 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  None );.      as
14b40 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f  sert( pIdx->auto
14b50 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61  Index );.      a
14b60 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f  ssert( pIndex->o
14b70 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
14b80 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
14b90 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e  dx->nColumn!=pIn
14ba0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  dex->nColumn ) c
14bb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
14bc0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
14bd0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
14be0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
14bf0 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a  r *z1 = pIdx->az
14c00 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
14c10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
14c20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
14c30 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
14c40 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
14c50 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
14c60 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
14c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
14c80 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
14c90 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  !=pIndex->aSortO
14ca0 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  rder[k] ) break;
14cb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21  .        if( z1!
14cc0 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74  =z2 && sqlite3St
14cd0 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
14ce0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
14cf0 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
14d00 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
14d10 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
14d20 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
14d30 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
14d40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
14d50 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
14d60 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
14d70 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
14d80 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
14d90 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
14da0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
14db0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
14dc0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
14dd0 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
14de0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
14df0 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
14e00 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
14e10 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
14e20 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
14e30 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
14e40 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
14e50 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
14e60 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
14e70 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
14e80 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
14e90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
14ea0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
14eb0 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
14ec0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
14ed0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
14ee0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
14ef0 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
14f00 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
14f10 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
14f20 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
14f30 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
14f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14f50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14f70 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
14f80 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
14f90 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
14fa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14fb0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
14fc0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
14fd0 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
14fe0 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
14ff0 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
15000 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
15010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15020 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15030 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
15040 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
15050 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
15060 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
15070 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
15080 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
15090 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
150a0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
150b0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
150c0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
150d0 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
150e0 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
150f0 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
15100 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
15110 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15120 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
15130 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  x->zName, strlen
15140 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b  (pIndex->zName)+
15150 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  1, pIndex);.    
15160 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
15170 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
15180 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
15190 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
151a0 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
151b0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
151c0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
151d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
151e0 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
151f0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
15200 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
15210 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
15220 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
15230 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
15240 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
15250 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
15260 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
15270 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
15280 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
15290 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
152a0 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
152b0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
152c0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
152d0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
152e0 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
152f0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
15300 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
15310 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
15320 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
15330 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
15340 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
15350 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
15360 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
15370 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
15380 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
15390 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
153a0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
153b0 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
153c0 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
153d0 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
153e0 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
153f0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
15400 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
15410 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
15420 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
15430 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
15440 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
15450 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
15460 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
15470 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
15480 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
15490 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
154a0 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
154b0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
154c0 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
154d0 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
154e0 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
154f0 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
15500 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
15510 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
15520 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
15530 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
15540 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
15550 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
15560 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
15570 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
15580 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
15590 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
155a0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
155b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
155c0 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
155d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
155e0 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
155f0 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
15600 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
15610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
15620 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
15630 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
15640 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
15650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15660 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
15670 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
15680 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
15690 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
156a0 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
156b0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
156c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
156d0 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
156e0 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
156f0 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
15700 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
15710 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
15720 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
15730 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
15740 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
15750 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
15760 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
15770 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
15780 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
15790 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
157a0 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a  .        pEnd->z
157b0 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c   - pName->z + 1,
157c0 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
157d0 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
157e0 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
157f0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
15800 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
15810 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
15820 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
15830 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
15840 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
15850 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
15860 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
15870 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
15880 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
15890 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
158a0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
158b0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
158c0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
158d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
158e0 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
158f0 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
15900 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
15910 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
15920 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
15930 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
15940 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
15950 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
15960 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
15970 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
15980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15990 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a  (zStmt);..    /*
159a0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
159b0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
159c0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
159d0 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
159e0 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
159f0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
15a00 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
15a10 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
15a20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
15a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15a40 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
15a50 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
15a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
15a70 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
15a80 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
15a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15aa0 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
15ab0 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
15ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
15ad0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
15ae0 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
15af0 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d  zName), P4_DYNAM
15b00 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
15b10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15b20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20  OP_Expire, 0);. 
15b30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
15b40 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
15b50 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
15b60 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
15b70 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
15b80 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
15b90 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
15ba0 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
15bb0 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
15bc0 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
15bd0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
15be0 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
15bf0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
15c00 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
15c10 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
15c20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
15c30 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
15c40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
15c50 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
15c60 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
15c70 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
15c80 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
15c90 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
15ca0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
15cb0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
15cc0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
15cd0 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
15ce0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
15cf0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
15d00 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
15d10 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
15d20 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
15d30 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
15d40 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
15d50 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
15d60 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
15d70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15d80 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
15d90 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
15da0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
15db0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
15dc0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15dd0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
15de0 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
15df0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
15e00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15e10 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
15e20 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
15e30 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
15e40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
15e50 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
15e60 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
15e70 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
15e80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
15e90 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
15ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15eb0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73  e code to make s
15ec0 75 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ure the file for
15ed0 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74  mat number is at
15ee0 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74   least minFormat
15ef0 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74  ..** The generat
15f00 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63  ed code will inc
15f10 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66  rease the file f
15f20 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20  ormat number if 
15f30 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f  necessary..*/.vo
15f40 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75  id sqlite3Minimu
15f50 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73  mFileFormat(Pars
15f60 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
15f70 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61  Db, int minForma
15f80 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  t){.  Vdbe *v;. 
15f90 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15fa0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15fb0 66 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( v ){.    int 
15fc0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
15fd0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15fe0 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
15ff0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16000 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20  Parse);.    int 
16010 6a 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  j1;.    sqlite3V
16020 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16030 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
16040 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c   r1, 1);.    sql
16050 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
16060 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  e(v, iDb);.    s
16070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16080 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16090 6d 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29 3b 0a  minFormat, r2);.
160a0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
160b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
160c0 5f 47 65 2c 20 72 32 2c 20 30 2c 20 72 31 29 3b  _Ge, r2, 0, r1);
160d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
160e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
160f0 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20  Cookie, iDb, 1, 
16100 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r2);.    sqlite3
16110 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16120 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
16130 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16140 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
16150 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16160 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
16170 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
16180 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
16190 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
161a0 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
161b0 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
161c0 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
161d0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
161e0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
161f0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
16200 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
16210 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63   is suppose to c
16220 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
16230 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
16240 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
16250 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
16260 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
16270 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
16280 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
16290 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
162a0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
162b0 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
162c0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
162d0 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
162e0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
162f0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
16300 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
16310 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
16320 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
16330 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
16340 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
16350 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  iniation of the 
16360 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
16370 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
16380 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
16390 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
163a0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
163b0 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
163c0 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
163d0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
163e0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
163f0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
16400 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
16410 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
16420 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
16430 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
16440 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
16450 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
16460 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
16470 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
16480 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
16490 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
164a0 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
164b0 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
164c0 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
164d0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
164e0 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
164f0 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
16500 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
16510 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b   assert( a!=0 );
16520 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30  .  a[0] = 100000
16530 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d  0;.  for(i=pIdx-
16540 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20  >nColumn; i>=5; 
16550 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i--){.    a[i] =
16560 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   5;.  }.  while(
16570 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69   i>=1 ){.    a[i
16580 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20  ] = 11 - i;.    
16590 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  i--;.  }.  if( p
165a0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
165b0 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70  _None ){.    a[p
165c0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20  Idx->nColumn] = 
165d0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
165e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
165f0 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
16600 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
16610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
16620 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
16630 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
16640 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
16650 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
16660 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
16670 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
16680 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
16690 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
166a0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
166b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
166c0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
166d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
166e0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
166f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
16700 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
16710 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
16720 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
16730 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
16740 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
16750 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
16760 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
16770 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
16780 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
16790 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
167a0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
167b0 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
167c0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
167d0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
167e0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
167f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16800 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16810 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
16820 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
16830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
16840 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
16850 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
16860 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16870 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
16880 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
16890 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
168a0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
168b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
168c0 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
168d0 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
168e0 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
168f0 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
16900 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16910 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
16920 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
16930 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
16940 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
16950 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
16960 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
16970 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
16980 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
16990 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
169a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
169b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
169c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
169d0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
169e0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
169f0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
16a00 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
16a10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16a20 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16a30 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
16a40 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
16a50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
16a60 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16a70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
16a80 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
16a90 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
16aa0 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
16ab0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16ac0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16ad0 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
16ae0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
16af0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
16b00 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16b10 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
16b20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16b30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16b40 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
16b50 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
16b60 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
16b70 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16b80 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16b90 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
16ba0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16bb0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
16bc0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16bd0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
16be0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
16bf0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
16c00 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
16c10 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
16c20 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
16c30 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
16c40 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
16c50 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ame.    );.    i
16c60 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
16c70 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
16c80 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b  stat1", db->aDb[
16c90 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  iDb].zName) ){. 
16ca0 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
16cb0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
16cc0 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
16cd0 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
16ce0 74 61 74 31 20 57 48 45 52 45 20 69 64 78 3d 25  tat1 WHERE idx=%
16cf0 51 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  Q",.        db->
16d00 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
16d10 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
16d20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
16d30 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
16d40 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
16d50 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
16d60 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
16d70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
16d80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16d90 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
16da0 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
16db0 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
16dc0 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
16dd0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
16de0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
16df0 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
16e00 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
16e10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
16e20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
16e30 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  .  Each object i
16e40 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
16e50 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
16e60 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20 72  in size.  This r
16e70 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
16e80 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74   a new.** object
16e90 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74   on the end of t
16ea0 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
16eb0 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65 20  *pnEntry is the 
16ec0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
16ed0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65  s already in use
16ee0 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a  .  *pnAlloc is.*
16ef0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  * the previously
16f00 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   allocated size 
16f10 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20 69  of the array.  i
16f20 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a 2a  nitSize is the.*
16f30 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e 69 74  * suggested init
16f40 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20 61  ial array size a
16f50 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  llocation..**.**
16f60 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
16f70 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 72  e new entry is r
16f80 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64 78  eturned in *pIdx
16f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16fa0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 70  tine returns a p
16fb0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
16fc0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
16fd0 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62   This.** might b
16fe0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
16ff0 65 20 70 41 72 72 61 79 20 70 61 72 61 6d 65 74  e pArray paramet
17000 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  er or it might b
17010 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  e a different.**
17020 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65 20   pointer if the 
17030 61 72 72 61 79 20 77 61 73 20 72 65 73 69 7a 65  array was resize
17040 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
17050 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
17060 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
17070 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
17080 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
17090 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
170a0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
170b0 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
170c0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
170d0 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
170e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
170f0 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
17100 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
17110 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
17120 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c  .  int initSize,
17130 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74 65       /* Suggeste
17140 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61  d initial alloca
17150 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
17160 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  s */.  int *pnEn
17170 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
17180 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
17190 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
171a0 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63  /.  int *pnAlloc
171b0 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ,     /* Current
171c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
171d0 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
171e0 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
171f0 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
17200 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
17210 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
17220 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
17230 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74 72  z;.  if( *pnEntr
17240 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b  y >= *pnAlloc ){
17250 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b  .    void *pNew;
17260 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65  .    int newSize
17270 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
17280 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69  (*pnAlloc)*2 + i
17290 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  nitSize;.    pNe
172a0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
172b0 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
172c0 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79   newSize*szEntry
172d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
172e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
172f0 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
17300 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
17310 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20   }.    *pnAlloc 
17320 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70  = newSize;.    p
17330 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
17340 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
17350 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
17360 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a  &z[*pnEntry * sz
17370 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
17380 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a  ry);.  *pIdx = *
17390 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e  pnEntry;.  ++*pn
173a0 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
173b0 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
173c0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
173d0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
173e0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
173f0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
17400 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
17410 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
17420 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
17430 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
17440 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
17450 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
17460 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
17470 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
17480 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
17490 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
174a0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
174b0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
174c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
174d0 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
174e0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
174f0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
17500 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
17510 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
17520 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
17530 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
17540 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
17550 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
17560 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
17570 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20  [0]),.      5,. 
17580 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
17590 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
175a0 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69  nAlloc,.      &i
175b0 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
175c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
175d0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
175e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
175f0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
17600 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
17610 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
17620 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
17630 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
17640 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
17650 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
17660 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
17670 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
17680 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
17690 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
176a0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
176b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
176c0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
176d0 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  _free(pList->a[i
176e0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
176f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
17700 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
17710 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  3_free(pList);.}
17720 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17730 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
17740 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
17750 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
17760 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
17770 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
17780 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
17790 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
177a0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
177b0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
177c0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
177d0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
177e0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
177f0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
17800 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
17810 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
17820 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
17830 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
17840 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
17850 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
17860 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
17870 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
17880 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
17890 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
178a0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
178b0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
178c0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
178d0 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
178e0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
178f0 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72  new SrcList is r
17900 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
17910 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
17920 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ls..**.** If pDa
17930 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
17940 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
17950 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
17960 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
17970 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
17980 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
17990 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
179a0 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
179b0 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
179c0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
179d0 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
179e0 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
179f0 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
17a00 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
17a10 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
17a20 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
17a30 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
17a40 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
17a50 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
17a60 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
17a70 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
17a80 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
17a90 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
17aa0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
17ab0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
17ac0 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
17ad0 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
17ae0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
17af0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
17b00 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
17b10 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
17b20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
17b30 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
17b40 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a  end(D,A,B,0);.**
17b50 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
17b60 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
17b70 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
17b80 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
17b90 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
17ba0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
17bc0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
17bd0 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
17be0 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
17bf0 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
17c00 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
17c10 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
17c20 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
17c30 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
17c40 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
17c50 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
17c60 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
17c70 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
17c80 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
17c90 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
17ca0 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
17cb0 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
17cc0 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
17cd0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
17ce0 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
17cf0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
17d00 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
17d10 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
17d20 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
17d30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17d40 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
17d50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
17d60 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
17d70 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
17d80 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
17d90 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
17da0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17db0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
17dc0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  1;.  }.  if( pLi
17dd0 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d  st->nSrc>=pList-
17de0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
17df0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
17e00 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
17e10 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d  *= 2;.    pNew =
17e20 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
17e30 63 28 64 62 2c 20 70 4c 69 73 74 2c 0a 20 20 20  c(db, pList,.   
17e40 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
17e50 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c  of(*pList) + (pL
17e60 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ist->nAlloc-1)*s
17e70 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
17e80 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
17e90 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
17ea0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
17eb0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
17ec0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
17ed0 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
17ee0 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
17ef0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
17f00 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73  t->nSrc];.  mems
17f10 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
17f20 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
17f30 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  );.  if( pDataba
17f40 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
17f50 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
17f60 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
17f70 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
17f80 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  && pTable ){.   
17f90 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
17fa0 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
17fb0 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
17fc0 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
17fd0 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
17fe0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
17ff0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
18000 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
18010 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
18020 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18030 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
18040 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d  abase);.  pItem-
18050 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  >iCursor = -1;. 
18060 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
18070 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74  ted = 0;.  pList
18080 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
18090 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
180a0 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
180b0 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
180c0 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
180d0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
180e0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
180f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
18100 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
18110 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
18120 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18130 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
18140 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
18150 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
18160 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
18170 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
18180 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
18190 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
181a0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
181b0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
181c0 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
181d0 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
181e0 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
181f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
18200 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
18210 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
18220 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
18230 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
18240 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
18250 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
18260 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
18270 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18280 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
18290 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
182a0 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
182b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
182c0 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
182d0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
182e0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
182f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
18300 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
18310 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
18320 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
18330 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
18340 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
18350 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
18360 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44  3_free(pItem->zD
18370 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
18380 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d  lite3_free(pItem
18390 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
183a0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d  lite3_free(pItem
183b0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73  ->zAlias);.    s
183c0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
183d0 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  e(pItem->pTab);.
183e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
183f0 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
18400 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
18410 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
18420 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
18430 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
18440 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ete(pItem->pUsin
18450 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
18460 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  3_free(pList);.}
18470 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18480 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
18490 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
184a0 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
184b0 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
184c0 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
184d0 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
184e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
184f0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
18500 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
18510 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
18520 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
18530 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
18540 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
18550 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
18560 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
18570 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
18580 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
18590 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
185a0 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
185b0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
185c0 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
185d0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
185e0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
185f0 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
18600 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
18610 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
18620 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
18630 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70   a alias, then p
18640 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
18650 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
18660 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
18670 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
18680 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
18690 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
186a0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
186b0 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
186c0 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
186d0 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
186e0 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
186f0 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
18700 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
18710 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
18720 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
18730 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
18740 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
18750 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
18760 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
18770 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
18780 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
18790 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
187a0 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
187b0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
187c0 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
187d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
187e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
187f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18800 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
18810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18820 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
18830 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
18840 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
18850 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
18860 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18870 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
18880 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
18890 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
188a0 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
188b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
188c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
188d0 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
188e0 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
188f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
18900 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
18910 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
18920 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
18930 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
18940 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
18950 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
18960 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
18970 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
18980 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
18990 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
189a0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
189b0 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
189c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
189d0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
189e0 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
189f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18a00 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
18a10 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
18a20 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69  ->db;.  p = sqli
18a30 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
18a40 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
18a50 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
18a60 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72  ( p==0 || p->nSr
18a70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==0 ){.    sqli
18a80 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4f  te3ExprDelete(pO
18a90 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
18aa0 64 4c 69 73 74 44 65 6c 65 74 65 28 70 55 73 69  dListDelete(pUsi
18ab0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
18ac0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
18ad0 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65 74  bquery);.    ret
18ae0 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74  urn p;.  }.  pIt
18af0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
18b00 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c  rc-1];.  if( pAl
18b10 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e  ias && pAlias->n
18b20 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
18b30 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
18b40 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
18b50 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
18b60 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
18b70 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
18b80 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
18b90 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
18ba0 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
18bb0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn p;.}../*.** W
18bc0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
18bd0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
18be0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
18bf0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
18c00 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
18c10 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
18c20 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
18c30 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
18c40 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
18c50 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
18c60 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
18c70 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
18c80 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
18c90 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
18ca0 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
18cb0 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
18cc0 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
18cd0 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
18ce0 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
18cf0 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
18d00 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
18d10 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
18d20 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
18d30 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
18d40 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
18d50 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
18d60 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
18d70 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
18d80 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
18d90 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
18da0 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
18db0 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
18dc0 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
18dd0 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
18de0 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
18df0 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
18e00 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
18e10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
18e20 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
18e30 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
18e40 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20   && p->a ){.    
18e50 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
18e60 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
18e70 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
18e80 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
18e90 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
18ea0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
18eb0 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
18ec0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
18ed0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
18ee0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
18ef0 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
18f00 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
18f10 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
18f20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18f30 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
18f40 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
18f50 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
18f60 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
18f70 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
18f80 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
18f90 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
18fa0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18fb0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
18fc0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18fd0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
18fe0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
18ff0 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
19000 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
19010 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
19020 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
19030 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
19040 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
19050 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
19060 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
19070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19080 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
19090 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
190a0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
190b0 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
190c0 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
190d0 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
190e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
190f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
19100 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
19110 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
19120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
19130 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
19140 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
19150 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
19160 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
19170 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
19180 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
19190 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
191a0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
191b0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
191c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
191d0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
191e0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
191f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
19200 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
19210 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
19220 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  N, "COMMIT", 0, 
19230 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
19240 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
19250 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
19260 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
19270 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19280 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
19290 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
192a0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
192b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
192c0 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
192d0 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
192e0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
192f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
19300 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
19310 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
19320 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
19330 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
19340 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
19350 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
19360 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
19370 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
19380 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
19390 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
193a0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
193b0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
193c0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
193d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
193e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
193f0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
19400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19410 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
19420 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
19430 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
19440 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
19450 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
19460 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
19470 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
19480 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
19490 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
194a0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
194b0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
194c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
194d0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
194e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
194f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
19500 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
19510 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
19520 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
19530 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
19540 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74  int rc;.    stat
19550 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
19560 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
19570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19580 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
19590 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
195a0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
195b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
195c0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
195d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
195e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
195f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19600 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
19610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
19620 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
19630 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46  0, 0, SQLITE_DEF
19640 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c  AULT_CACHE_SIZE,
19650 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20   flags,.        
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44           &db->aD
19680 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
19690 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
196a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
196b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
196c0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
196d0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
196e0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
196f0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
19700 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
19710 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
19720 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
19730 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19740 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19750 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
19760 49 54 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20  ITE_InTrans)==0 
19770 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
19780 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
19790 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
197a0 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
197b0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
197c0 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  de(sqlite3BtreeP
197d0 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  ager(db->aDb[1].
197e0 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pBt),.          
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61    db->dfltJourna
19810 6c 4d 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65  lMode);.  }.  re
19820 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
19830 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
19840 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
19850 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
19860 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
19870 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
19880 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
19890 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
198a0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
198b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
198c0 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
198d0 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
198e0 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
198f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
19900 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
19910 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
19920 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
19930 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
19940 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
19950 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
19960 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
19970 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
19980 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
19990 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
199a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
199b0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
199c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
199d0 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
199e0 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
199f0 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
19a00 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
19a10 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
19a20 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
19a30 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
19a40 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
19a50 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
19a60 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
19a70 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
19a80 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
19a90 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
19aa0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
19ab0 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
19ac0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
19ad0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
19ae0 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
19af0 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
19b00 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
19b10 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
19b20 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
19b30 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
19b40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
19b50 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
19b60 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
19b70 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
19b80 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
19b90 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
19ba0 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
19bb0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
19bc0 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
19bd0 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
19be0 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
19bf0 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
19c00 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
19c10 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
19c20 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
19c30 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
19c40 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
19c50 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
19c60 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
19c70 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
19c80 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
19c90 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
19ca0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
19cb0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
19cc0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
19cd0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
19ce0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
19cf0 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
19d00 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
19d10 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
19d20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
19d30 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
19d40 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
19d50 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
19d60 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
19d70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f   if( pParse->coo
19d80 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
19d90 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
19da0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
19db0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19dc0 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
19dd0 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
19de0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
19df0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
19e00 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
19e10 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
19e20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
19e30 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
19e40 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
19e50 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c  );.    mask = 1<
19e60 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
19e70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
19e80 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
19e90 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
19ea0 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
19eb0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
19ec0 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
19ed0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
19ee0 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
19ef0 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66  cookie;.      if
19f00 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
19f10 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
19f20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
19f30 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72  empDatabase(pPar
19f40 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
19f50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19f60 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
19f70 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
19f80 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
19f90 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
19fa0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
19fb0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
19fc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
19fd0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
19fe0 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
19ff0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
1a000 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
1a010 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
1a020 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
1a030 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
1a040 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
1a050 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
1a060 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
1a070 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
1a080 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
1a090 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
1a0a0 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
1a0b0 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
1a0c0 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
1a0d0 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
1a0e0 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
1a0f0 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
1a100 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
1a110 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
1a120 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
1a130 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
1a140 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
1a150 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
1a160 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
1a170 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
1a180 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
1a190 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
1a1a0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1a1b0 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
1a1c0 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
1a1d0 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
1a1e0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
1a1f0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
1a200 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74  ..**.** Only dat
1a210 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68  abase iDb and th
1a220 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
1a230 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
1a240 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a  e by this call..
1a250 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68  ** If iDb==0, th
1a260 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20  en the main and 
1a270 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61  temp databases a
1a280 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
1a290 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31  .   If.** iDb==1
1a2a0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74   then only the t
1a2b0 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20  emp database is 
1a2c0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
1a2d0 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68  If iDb>1 then th
1a2e0 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61  e.** specified a
1a2f0 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
1a300 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  e and the temp d
1a310 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
1a320 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f   writable..*/.vo
1a330 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1a340 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1a350 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1a360 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1a370 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
1a380 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1a390 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1a3a0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1a3b0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
1a3c0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1a3d0 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72  se, iDb);.  pPar
1a3e0 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d  se->writeMask |=
1a3f0 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73   1<<iDb;.  if( s
1a400 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  etStatement && p
1a410 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
1a420 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a430 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a440 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b  Statement, iDb);
1a450 0a 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54  .  }.  if( (OMIT
1a460 5f 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d  _TEMPDB || iDb!=
1a470 31 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  1) && pParse->db
1a480 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20  ->aDb[1].pBt!=0 
1a490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1a4a0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1a4b0 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
1a4c0 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
1a4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
1a4e0 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
1a4f0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1a500 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1a510 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
1a520 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
1a530 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
1a540 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
1a550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1a560 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
1a570 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
1a580 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
1a590 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
1a5a0 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  x){.  int i;.  f
1a5b0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
1a5c0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1a5d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1a5e0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
1a5f0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  oll[i];.    if( 
1a600 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26  z==zColl || (z &
1a610 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71  & zColl && 0==sq
1a620 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
1a630 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20  zColl)) ){.     
1a640 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1a650 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a660 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a670 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1a680 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
1a690 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
1a6a0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1a6b0 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
1a6c0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1a6d0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1a6e0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
1a6f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a700 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1a710 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
1a720 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a730 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
1a740 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1a750 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1a760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a770 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
1a780 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
1a790 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
1a7a0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1a7b0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
1a7c0 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
1a7d0 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
1a7e0 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
1a7f0 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
1a800 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
1a810 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1a820 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1a830 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1a840 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1a850 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1a860 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1a870 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1a880 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1a890 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1a8a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
1a8b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1a8c0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1a8d0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
1a8e0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1a8f0 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
1a900 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
1a910 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1a920 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
1a930 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
1a940 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
1a950 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
1a960 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1a970 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1a980 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1a990 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
1a9a0 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
1a9b0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
1a9c0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9e0 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
1a9f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1aa20 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1aa30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1aa40 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1aa50 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1aa60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1aa70 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa90 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1aaa0 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
1aab0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1aac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aad0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1aae0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
1aaf0 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1ab00 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1ab10 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1ab20 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1ab30 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1ab40 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1ab50 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1ab60 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1ab70 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1ab80 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1ab90 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1aba0 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1abb0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1abc0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1abd0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1abe0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1abf0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1ac00 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1ac10 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1ac20 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac40 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1ac50 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1ac60 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1ac80 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1ac90 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1aca0 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1acb0 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1acc0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1acd0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1ace0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1acf0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1ad00 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1ad10 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1ad20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1ad30 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1ad40 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1ad50 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1ad60 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1ad70 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1ad80 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1ad90 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1ada0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1adb0 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1adc0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1add0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1ade0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1adf0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1ae00 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1ae10 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1ae20 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1ae30 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1ae40 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1ae50 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1ae60 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1ae70 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1ae80 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1ae90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1aec0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1aed0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1aee0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1aef0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1af00 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1af10 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1af20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1af30 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1af40 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1af50 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1af60 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1af70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1af80 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1af90 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1afa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1afb0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1afc0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1afd0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1afe0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1aff0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1b000 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1b010 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1b020 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1b030 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1b040 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1b050 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1b060 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1b070 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1b080 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1b090 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1b0a0 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1b0b0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1b0c0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1b0d0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1b0e0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1b0f0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1b100 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1b110 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
1b120 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
1b130 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1b140 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1b150 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1b160 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
1b170 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
1b180 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
1b190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1b1a0 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
1b1b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
1b1c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1b1d0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
1b1e0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1b1f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
1b200 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1b210 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1b220 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20  db), zColl, -1, 
1b230 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1b240 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  l ){.      if( z
1b250 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1b260 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1b270 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1b280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b290 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20  _free(zColl);.  
1b2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1b2b0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1b2c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c  lite3_free(zColl
1b2d0 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
1b2e0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
1b2f0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
1b300 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
1b310 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
1b320 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
1b330 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1b340 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
1b350 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
1b360 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
1b370 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1b380 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
1b390 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1b3a0 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1b3b0 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
1b3c0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1b3d0 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
1b3e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b3f0 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
1b400 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1b410 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1b420 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
1b430 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
1b440 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1b450 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1b460 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1b470 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1b480 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1b490 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1b4a0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1b4b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
1b4c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b4d0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1b4e0 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
1b4f0 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
1b500 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
1b510 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1b520 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63   dynamicly alloc
1b530 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72  ated KeyInfo str
1b540 75 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20  ucture that can 
1b550 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20  be used.** with 
1b560 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f  OP_OpenRead or O
1b570 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61  P_OpenWrite to a
1b580 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69  ccess database i
1b590 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
1b5a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1b5b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b5c0 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69   new structure i
1b5d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
1b5e0 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20  his case.** the 
1b5f0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1b600 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1b610 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
1b620 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
1b630 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66   .** pointer. If
1b640 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b650 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20   (out of memory 
1b660 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61  or missing colla
1b670 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63  tion .** sequenc
1b680 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  e), NULL is retu
1b690 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61  rned and the sta
1b6a0 74 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64  te of pParse upd
1b6b0 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a  ated to reflect.
1b6c0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f  ** the error..*/
1b6d0 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
1b6e0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61  3IndexKeyinfo(Pa
1b6f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
1b700 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
1b710 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
1b720 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
1b730 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73    int nBytes = s
1b740 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
1b750 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
1b760 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f  (CollSeq*) + nCo
1b770 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
1b780 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29  ey = (KeyInfo *)
1b790 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1b7a0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
1b7b0 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
1b7c0 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
1b7d0 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64  ->db = pParse->d
1b7e0 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  b;.    pKey->aSo
1b7f0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
1b800 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43  &(pKey->aColl[nC
1b810 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ol]);.    assert
1b820 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72  ( &pKey->aSortOr
1b830 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75  der[nCol]==&(((u
1b840 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73  8 *)pKey)[nBytes
1b850 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ]) );.    for(i=
1b860 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
1b870 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
1b880 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
1b890 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  l[i];.      asse
1b8a0 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20  rt( zColl );.   
1b8b0 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
1b8c0 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  ] = sqlite3Locat
1b8d0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1b8e0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20   zColl, -1);.   
1b8f0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1b900 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
1b910 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1b920 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46    }.    pKey->nF
1b930 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d  ield = nCol;.  }
1b940 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1b950 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
1b960 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
1b970 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
1b980 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
1b990 0a 7d 0a                                         .}.