/ Hex Artifact Content
Login

Artifact 739eeee868e97a69c27e72636ca5be824da87703:


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 35 38 20 32 30 30 38 2f 30 31 2f 30 35  1.458 2008/01/05
02f0: 20 30 34 3a 30 36 3a 30 34 20 64 72 68 20 45 78   04:06:04 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 69 66 28 20 70 2d 3e 69 73 57  ;.    if( p->isW
0cc0: 72 69 74 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  riteLock ){.    
0cd0: 20 20 70 31 20 3d 20 2d 31 2a 28 70 31 2b 31 29    p1 = -1*(p1+1)
0ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 56  te3VdbeAddOp4(pV
0d00: 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63  dbe, OP_TableLoc
0d10: 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20  k, p1, p->iTab, 
0d20: 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f  0, p->zName, P4_
0d30: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d40: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d50: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0d80: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0d90: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0da0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0db0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0dc0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0dd0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0de0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0df0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e00: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e10: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e20: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e30: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e40: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e50: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e60: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e70: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0e80: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0e90: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ea0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0eb0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ec0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0ee0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0ef0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f00: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f10: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f20: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f50: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
0f70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
0f80: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
0f90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
0fa0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  & pParse->nErr )
0fb0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
0fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
0fd0: 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  R;.      return;
0fe0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
0ff0: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
1000: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
1010: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
1020: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
1030: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
1040: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1050: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1060: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1080: 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b 0a  p0(v, OP_Halt);.
1090: 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b  .    /* The cook
10a0: 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73  ie mask contains
10b0: 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   one bit for eac
10c0: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
10d0: 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69  open..    ** (Bi
10e0: 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c  t 0 is for main,
10f0: 20 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65   bit 1 is for te
1100: 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  mp, and so forth
1110: 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20  .)  Bits are.   
1120: 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68   ** set for each
1130: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
1140: 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74  s used.  Generat
1150: 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20  e code to start 
1160: 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  a.    ** transac
1170: 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65  tion on each use
1180: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  d database and t
1190: 6f 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  o verify the sch
11a0: 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a  ema cookie.    *
11b0: 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64  * on each used d
11c0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
11d0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
11e0: 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a  cookieGoto>0 ){.
11f0: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a        u32 mask;.
1200: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
1210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1220: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
1230: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31  se->cookieGoto-1
1240: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62  );.      for(iDb
1250: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c  =0, mask=1; iDb<
1260: 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d  db->nDb; mask<<=
1270: 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  1, iDb++){.     
1280: 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70     if( (mask & p
1290: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
12a0: 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  k)==0 ) continue
12b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12c0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
12d0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
12e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f0: 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69  2(v,OP_Transacti
1300: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
1310: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1320: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
1330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1340: 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79 43 6f  p2(v,OP_VerifyCo
1350: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1370: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69  Db]);.      }.#i
1380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1390: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13a0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
13b0: 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20 29 7b  >pVirtualLock ){
13c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
13d0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50  tab = (char *)pP
13e0: 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f  arse->pVirtualLo
13f0: 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ck->pVtab;.     
1400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1410: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1420: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1430: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1440: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1450: 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68    /* Once all th
1460: 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62  e cookies have b
1470: 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64  een verified and
1480: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70   transactions op
1490: 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20  ened, .      ** 
14a0: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
14b0: 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e  red table-locks.
14c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
14d0: 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20   unless the .   
14e0: 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63     ** shared-cac
14f0: 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
1500: 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  abled..      */.
1510: 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c        codeTableL
1520: 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 20 20  ocks(pParse);.  
1530: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1540: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1550: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  , 0, pParse->coo
1560: 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  kieGoto);.    }.
1570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1580: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 2f  OMIT_TRACE.    /
1590: 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68  * Add a No-op th
15a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
15b0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
15c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51   the compiled SQ
15d0: 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  L.    ** stateme
15e0: 6e 74 20 61 73 20 69 74 73 20 50 34 20 61 72 67  nt as its P4 arg
15f0: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65  ument.  This doe
1600: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
1610: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20   functionality. 
1620: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f     ** of the pro
1630: 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  gram. .    **.  
1640: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
1650: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
1660: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a  qlite3_trace()..
1670: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1680: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1690: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 30  OP_Noop, 0, 0, 0
16a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
16c0: 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54  zSql, pParse->zT
16d0: 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c  ail-pParse->zSql
16e0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16f0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
1700: 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74  /.  }...  /* Get
1710: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1720: 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63  m ready for exec
1730: 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28  ution.  */.  if(
1740: 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45   v && pParse->nE
1750: 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61  rr==0 && !db->ma
1760: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23 69  llocFailed ){.#i
1770: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1780: 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63  G.    FILE *trac
1790: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
17a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63   SQLITE_VdbeTrac
17b0: 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a  e)!=0 ? stdout :
17c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   0;.    sqlite3V
17d0: 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63  dbeTrace(v, trac
17e0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  e);.#endif.    s
17f0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1800: 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e  ady(v, pParse->n
1810: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65  Var, pParse->nMe
1820: 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20  m+3,.           
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1840: 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50  arse->nTab+3, pP
1850: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a  arse->explain);.
1860: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1870: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1880: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
1890: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
18a0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
18b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
18d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
18e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
18f0: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
1900: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
1910: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
1920: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
1930: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
1940: 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  kieMask = 0;.  p
1950: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1960: 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  o = 0;.}../*.** 
1970: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1980: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1990: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
19a0: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
19b0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
19c0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
19d0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
19e0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
19f0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1a00: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1a10: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1a20: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1a30: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1a40: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1a50: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1a60: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1a70: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1a80: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1a90: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1aa0: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1ab0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1ac0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1ad0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1ae0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1af0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1b00: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1b10: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1b20: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1b30: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1b40: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
1b50: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
1b60: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
1b70: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
1b80: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
1b90: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
1ba0: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1bb0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
1bc0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
1bd0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
1be0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1bf0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
1c00: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
1c10: 68 61 72 20 2a 7a 53 71 6c 3b 0a 23 20 64 65 66  har *zSql;.# def
1c20: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
1c30: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
1c40: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
1c50: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
1c60: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
1c70: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1c80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
1c90: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
1ca0: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
1cb0: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
1cc0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
1cd0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
1ce0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1cf0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
1d00: 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73  e3VMPrintf(pPars
1d10: 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  e->db, zFormat, 
1d20: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1d30: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1d40: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1d50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d60: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1d70: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1d80: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1d90: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1da0: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1db0: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1dc0: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1dd0: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1de0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1df0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1e00: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1e10: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 30 29 3b  Parse, zSql, 0);
1e20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e30: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
1e40: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
1e50: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
1e60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
1e70: 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ed--;.}../*.** L
1e80: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
1e90: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
1ea0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
1eb0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
1ec0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
1ed0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
1ee0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1ef0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1f00: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
1f10: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1f20: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1f30: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1f40: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
1f50: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
1f60: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
1f70: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
1f80: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
1f90: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
1fa0: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
1fb0: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
1fc0: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
1fd0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
1fe0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
1ff0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
2000: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
2010: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
2020: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2030: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2040: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2050: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2060: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2070: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2080: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2090: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
20a0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
20b0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
20c0: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
20d0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
20e0: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
20f0: 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( zName!=0 );.  
2100: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2110: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2120: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2130: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2140: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2150: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2160: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
2170: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
2180: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
2190: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
21a0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
21b0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
21c0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
21d0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
21e0: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
21f0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2200: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2210: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2220: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2230: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2240: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2250: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2260: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2270: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2280: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2290: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
22a0: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
22b0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
22c0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
22d0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
22e0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
22f0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2300: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2310: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2320: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2330: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2340: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2350: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2360: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2370: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2380: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2390: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
23a0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
23b0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
23c0: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
23d0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
23e0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  te3LocateTable(P
23f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
2400: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2420: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
2430: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2440: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2450: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2460: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2470: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2480: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2490: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
24a0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
24b0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
24c0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
24d0: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
24e0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
24f0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2500: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2510: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2520: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( p==0 ){.    i
2530: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2540: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2550: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2560: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  uch table: %s.%s
2570: 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  ", zDbase, zName
2580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2590: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
25b0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
25c0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
25d0: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
25e0: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
25f0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2600: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2610: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2620: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2630: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
2640: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2650: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2660: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2670: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2680: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2690: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
26a0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
26b0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
26c0: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
26d0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
26e0: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
26f0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
2700: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
2710: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
2720: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2730: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
2740: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2750: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2760: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2770: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
2780: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2790: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
27a0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
27b0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
27c0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
27d0: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
27e0: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
27f0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2800: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2810: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
2820: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
2830: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  nt i;.  for(i=OM
2840: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2850: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2860: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2870: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2880: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2890: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
28a0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
28b0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
28c0: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
28d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28e0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
28f0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2900: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2910: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2920: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2930: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2940: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2950: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2960: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2970: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
2980: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2990: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20      }.    if( p 
29a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29c0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
29d0: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
29e0: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
29f0: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
2a00: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
2a10: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 6c  te3_free(p->zCol
2a20: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Aff);.  sqlite3_
2a30: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
2a40: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
2a50: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
2a60: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2a70: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
2a80: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
2a90: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
2aa0: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
2ab0: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2ac0: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
2ad0: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
2ae0: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2af0: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
2b00: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
2b10: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
2b20: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
2b30: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
2b40: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
2b50: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2b60: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64  eDeleteIndex(Ind
2b70: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2b80: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2b90: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2ba0: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
2bb0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2bc0: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
2bd0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2be0: 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31  strlen( zName)+1
2bf0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2c00: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2c10: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2c20: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2c30: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2c40: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2c50: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2c60: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2c70: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2c80: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2c90: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2ca0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2cb0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2cc0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2cd0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2ce0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2cf0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
2d00: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2d10: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2d20: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2d30: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2d40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2d50: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2d60: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2d70: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2d80: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2d90: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2da0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2db0: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2dc0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2dd0: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
2de0: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
2df0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
2e00: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
2e10: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2e20: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
2e30: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2e40: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
2e50: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
2e70: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
2e80: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
2e90: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
2ea0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
2eb0: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
2ec0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
2ed0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
2ee0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
2ef0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
2f00: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2f10: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
2f20: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
2f30: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
2f40: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2f50: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
2f60: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
2f70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
2f80: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
2f90: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
2fa0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
2fb0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2fc0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
2fd0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
2fe0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
2ff0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3000: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3010: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3020: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3030: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3040: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3050: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3060: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3070: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3080: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
3090: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
30a0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
30b0: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
30c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
30d0: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
30e0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
30f0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
3100: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
3110: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
3120: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3130: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
3140: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
3150: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
3160: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65  int i, j;.  asse
3170: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3180: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3190: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20  if( iDb==0 ){.  
31a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
31b0: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  terAll(db);.  }.
31c0: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
31d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
31e0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
31f0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3200: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
3210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69 3d  .      assert(i=
3220: 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20  =1 || (pDb->pBt 
3230: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  && sqlite3BtreeH
3240: 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70  oldsMutex(pDb->p
3250: 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Bt)));.      sql
3260: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
3270: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
3280: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
3290: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
32a0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
32b0: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
32c0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
32d0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
32e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
32f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  (db);..  /* If o
3300: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3310: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3320: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3330: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3340: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
3350: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
3360: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
3370: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
3380: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
3390: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
33a0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
33b0: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
33c0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
33d0: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
33e0: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
33f0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3400: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3410: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3420: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3440: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3450: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3460: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3470: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
3480: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
3490: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
34a0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
34b0: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
34c0: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
34d0: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
34e0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
34f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3500: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3510: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3520: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3530: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3540: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3550: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3560: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3570: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3590: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
35a0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
35b0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
35c0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
35d0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
35e0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
35f0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3600: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3610: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3620: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3630: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3640: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3650: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3660: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3670: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3680: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
3690: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
36a0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
36b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
36c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
36d0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
36e0: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
36f0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3700: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3710: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3720: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3730: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3740: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
3750: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
3760: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
3770: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
3780: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
3790: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
37a0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
37b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
37c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
37d0: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
37e0: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
37f0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3800: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3810: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3820: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3830: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3840: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
3850: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3860: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
3870: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3880: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
3890: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
38a0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
38b0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
38c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
38d0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
38e0: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
38f0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3900: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3910: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3920: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3930: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3940: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3950: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3960: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3970: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3980: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3990: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
39a0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
39b0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
39c0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
39d0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
39e0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
39f0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3a00: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3a10: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3a20: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3a30: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3a40: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3a50: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3a60: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3a70: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3a80: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3a90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3aa0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3ab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3ac0: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3ad0: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3ae0: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3af0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3b00: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3b10: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3b20: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3b30: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3b40: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3b50: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3b60: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3b70: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3b80: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3b90: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3ba0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3bb0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3bc0: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3bd0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3be0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3bf0: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3c00: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3c10: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3c20: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3c30: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3c40: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3c50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3c60: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3c70: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3c80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3c90: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3ca0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3cb0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3cc0: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3cd0: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3ce0: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3cf0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3d00: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3d10: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3d20: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3d30: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3d40: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3d50: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3d60: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3d70: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3d80: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3d90: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3da0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3db0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3dc0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
3dd0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
3de0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3e00: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
3e10: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3e20: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3e30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
3e40: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3e50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3e60: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3e70: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3e80: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3e90: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3ea0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3eb0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
3ec0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
3ed0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
3ee0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3ef0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
3f00: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
3f20: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3f30: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
3f40: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
3f50: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
3f60: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3f70: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
3f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
3f90: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
3fa0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
3fb0: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
3fc0: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
3fd0: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
3fe0: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
3ff0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
4000: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4010: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4020: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4030: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
4040: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
4050: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
4060: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
4070: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
4080: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
4090: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
40a0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
40b0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
40c0: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
40d0: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
40e0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
40f0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4100: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4110: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4120: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
4130: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
4140: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
4150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4160: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
4170: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
4180: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
4190: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
41a0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
41b0: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
41c0: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
41d0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
41e0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
41f0: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4200: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4210: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4220: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4230: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4240: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
4250: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
4260: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
4270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
4280: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
4290: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
42a0: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
42b0: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
42c0: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
42d0: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
42e0: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
42f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4300: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4310: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4320: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4330: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4340: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4360: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
4370: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
4380: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
4390: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
43a0: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
43b0: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
43c0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
43d0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
43e0: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
43f0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4400: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4410: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4420: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4430: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
4440: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
4450: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
4460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
4470: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
4480: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
4490: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
44a0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
44b0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
44c0: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
44d0: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
44e0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
44f0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
4500: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
4510: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4520: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
4530: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
4540: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
4550: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
4560: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
4570: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
4580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
4590: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
45a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
45b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
45c0: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
45d0: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
45e0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
45f0: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
4600: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
4610: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
4620: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
4630: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
4640: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4650: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
4660: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
4670: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
4680: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
4690: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
46a0: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
46b0: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
46c0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
46d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
46e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
46f0: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
4700: 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20  R_ROOT, iDb);.  
4710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4720: 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  2(v, OP_SetNumCo
4730: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
4740: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
4750: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
4760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
4770: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
4780: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
4790: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
47a0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
47b0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
47c0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
47d0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
47e0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
47f0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4800: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4810: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4820: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4830: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4840: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
4850: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
4860: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4870: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4880: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
4890: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
48a0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
48b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
48c0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
48d0: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
48e0: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
48f0: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4900: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4910: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4920: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4930: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4940: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
4950: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4960: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4970: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
4980: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ame ){.    n = s
4990: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
49a0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
49b0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
49c0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
49d0: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
49e0: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
49f0: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4a00: 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61  =strlen(pDb->zNa
4a10: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4a20: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4a30: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4a40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4a50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4a60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4a70: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
4a80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
4a90: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
4aa0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
4ab0: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
4ac0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
4ad0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
4ae0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
4af0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
4b00: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
4b10: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
4b20: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
4b30: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
4b40: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
4b50: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4b60: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
4b70: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
4b80: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
4b90: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
4ba0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4bb0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4bc0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
4bd0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4be0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
4bf0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4c00: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4c10: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
4c20: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4c30: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
4c40: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
4c50: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4c60: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
4c70: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4c80: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4c90: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
4ca0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
4cb0: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
4cc0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
4cd0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4ce0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4cf0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
4d00: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4d10: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4d20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4d30: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
4d40: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
4d50: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
4d60: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
4d70: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
4d80: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
4d90: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4da0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
4db0: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
4dc0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
4dd0: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
4de0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
4df0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4e00: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4e10: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
4e20: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
4e30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4e40: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
4e50: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
4e60: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
4e70: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
4e80: 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  );.    *pUnqual 
4e90: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
4ea0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
4eb0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
4ec0: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
4ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4ee0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
4ef0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
4f00: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
4f10: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
4f20: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
4f30: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
4f40: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
4f50: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
4f60: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
4f70: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
4f80: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
4f90: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
4fa0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4fb0: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
4fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4fd0: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
4fe0: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
4ff0: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
5000: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
5010: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
5020: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
5030: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
5040: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
5050: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
5060: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
5070: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
5080: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
5090: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
50a0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
50b0: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
50c0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
50d0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
50e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
50f0: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
5100: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
5110: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
5120: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5130: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5140: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
5150: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
5160: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
5170: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
5180: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
5190: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
51a0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
51b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
51c0: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
51d0: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
51e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
51f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
5200: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
5210: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5220: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
5230: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5240: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
5250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
5270: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
5280: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
5290: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
52a0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
52b0: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
52c0: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
52d0: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
52e0: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
52f0: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
5300: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5310: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
5320: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5330: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5340: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
5350: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
5360: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
5370: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
5380: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
5390: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
53a0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
53b0: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
53c0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
53d0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
53e0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
53f0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
5400: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
5410: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
5420: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
5430: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5440: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
5450: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
5460: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
5470: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
5480: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
5490: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
54a0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
54b0: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
54c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
54d0: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
54e0: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
54f0: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
5500: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
5510: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
5520: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
5530: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5540: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
5550: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5560: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
5570: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
5580: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
5590: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
55a0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
55b0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
55c0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
55d0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
55e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
55f0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5600: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5610: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
5620: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
5630: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5640: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
5650: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
5660: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
5670: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5680: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5690: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
56a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
56b0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
56c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
56d0: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
56e0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
56f0: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
5700: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
5710: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5720: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
5730: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5740: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
5750: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
5760: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
5770: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
5780: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
5790: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
57a0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
57b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
57c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
57d0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
57e0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
57f0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5800: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
5810: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
5820: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5830: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5840: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
5850: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
5860: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5870: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
5880: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5890: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
58a0: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
58b0: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
58c0: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
58d0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
58e0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
58f0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
5900: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5910: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
5920: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5930: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5940: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5950: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5960: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5970: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5980: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5990: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
59a0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
59b0: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
59c0: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
59d0: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
59e0: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
59f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5a00: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5a10: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5a20: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5a30: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5a40: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5a50: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5a60: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5a70: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5a80: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5a90: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
5aa0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5ab0: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
5ac0: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
5ad0: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
5ae0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
5af0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5b00: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5b10: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5b20: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5b30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5b40: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5b50: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5b60: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5b70: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5b80: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5b90: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5ba0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5bb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5bc0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5bd0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5be0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5bf0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5c00: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5c10: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5c20: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5c30: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5c40: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5c50: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5c60: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5c70: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5c80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5c90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5ca0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5cb0: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5cc0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5cd0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5ce0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5cf0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5d00: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5d10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5d20: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5d30: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
5d40: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
5d50: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
5d60: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
5d70: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5d80: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5d90: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5da0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5db0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5dc0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5dd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5de0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5df0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5e00: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5e10: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5e20: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5e30: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5e40: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5e50: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
5e60: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5e70: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
5e80: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
5e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5ea0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5eb0: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5ec0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5ed0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5ee0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
5ef0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f00: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5f10: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
5f20: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
5f30: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
5f40: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5f50: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
5f60: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
5f70: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
5f80: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
5f90: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5fa0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
5fb0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
5fc0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
5fd0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
5fe0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
5ff0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6000: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6010: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6020: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6030: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6040: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6050: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6060: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6070: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6080: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6090: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
60a0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
60b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
60c0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
60d0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
60e0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
60f0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6100: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6110: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6120: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6130: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6140: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6150: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6160: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6170: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6180: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
6190: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
61a0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
61b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
61c0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
61d0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
61e0: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
61f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6200: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6210: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
6220: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6230: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6240: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6250: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6260: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
6270: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
6280: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
6290: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
62a0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
62b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62c0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
62d0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
62e0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
62f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6300: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6310: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
6320: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
6330: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6340: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
6350: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
6360: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
6370: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
6380: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
6390: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
63a0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
63b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
63c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
63d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
63e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
63f0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
6400: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
6410: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
6420: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
6430: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
6440: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6450: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
6460: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  eTable(pParse->p
6470: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
6480: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
6490: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
64a0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
64b0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
64c0: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
64d0: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
64e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
64f0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
6500: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
6510: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
6520: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
6530: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
6540: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
6550: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
6560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6570: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
6580: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
6590: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
65a0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
65b0: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
65c0: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
65d0: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
65e0: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
65f0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
6600: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
6610: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
6620: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
6630: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
6640: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
6650: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
6660: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
6670: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
6680: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
6690: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
66a0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
66b0: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
66c0: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
66d0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
66e0: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
66f0: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
6700: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
6710: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
6720: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
6730: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
6740: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
6750: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
6760: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
6770: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
6780: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
6790: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
67a0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
67b0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
67c0: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
67d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
67e0: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
67f0: 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69 6e 74  int lbl;.    int
6800: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
6810: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
6820: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6830: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
6840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6850: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6860: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
6870: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6880: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
6890: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
68a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
68b0: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
68c0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
68d0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
68e0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
68f0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
6900: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
6910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6920: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
6930: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20  Cookie, iDb, 0, 
6940: 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f  1);   /* file_fo
6950: 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  rmat */.    sqli
6960: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
6970: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6c 62  (v, iDb);.    lb
6980: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
6990: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
69a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69b0: 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20  p2(v, OP_If, 0, 
69c0: 6c 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  lbl);.    fileFo
69d0: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
69e0: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
69f0: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
6a20: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
6a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a40: 70 31 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p1(v, OP_Integer
6a50: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20  , fileFormat);. 
6a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a70: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp2(v, OP_SetCo
6a80: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
6a90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6aa0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp1(v, OP_Integ
6ab0: 65 72 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  er, ENC(db));.  
6ac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ad0: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op2(v, OP_SetCoo
6ae0: 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20  kie, iDb, 4);.  
6af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
6b00: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
6b10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  );..    /* This 
6b20: 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70  just creates a p
6b30: 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f  lace-holder reco
6b40: 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  rd in the sqlite
6b50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20  _master table.. 
6b60: 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64     ** The record
6b70: 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f   created does no
6b80: 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69  t contain anythi
6b90: 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c  ng yet.  It will
6ba0: 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20   be replaced.   
6bb0: 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20   ** by the real 
6bc0: 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65  entry in code ge
6bd0: 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74  nerated at sqlit
6be0: 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20  e3EndTable()..  
6bf0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
6c00: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65  rowid for the ne
6c10: 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20  w entry is left 
6c20: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
6c30: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  e stack..    ** 
6c40: 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20  The rowid value 
6c50: 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  is needed by the
6c60: 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
6c70: 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a  e3EndTable will.
6c80: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e      ** generate.
6c90: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
6ca0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6cb0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
6cc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
6cd0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
6ce0: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
6cf0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
6d00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d10: 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op0(v, OP_Intege
6d20: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  r);.    }else.#e
6d30: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
6d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d50: 70 31 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p1(v, OP_CreateT
6d60: 61 62 6c 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  able, iDb);.    
6d70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
6d80: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
6d90: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
6da0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
6db0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 29  (v, OP_NewRowid)
6dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6dd0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6f  eAddOp0(v, OP_Co
6de0: 70 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  py);.    sqlite3
6df0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6e00: 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
6e10: 74 65 33 43 6f 64 65 49 6e 73 65 72 74 28 70 50  te3CodeInsert(pP
6e20: 61 72 73 65 2c 20 30 2c 20 4f 50 46 4c 41 47 5f  arse, 0, OPFLAG_
6e30: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
6e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
6e50: 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 20  , OP_Close);.   
6e60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6e70: 70 31 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  p1(v, OP_Pull, 1
6e80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
6e90: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
6ea0: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
6eb0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
6ec0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
6ed0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
6ee0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6ef0: 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
6f00: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
6f10: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
6f20: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
6f30: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
6f40: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
6f50: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
6f60: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
6f70: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
6f80: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
6f90: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
6fa0: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
6fb0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
6fc0: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
6fd0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
6fe0: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
6ff0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
7000: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
7010: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
7020: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
7030: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
7040: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
7050: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
7060: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
7070: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7080: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
7090: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
70a0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
70b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
70c0: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
70d0: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
70e0: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
70f0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
7100: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
7110: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
7120: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
7130: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
7140: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
7150: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
7160: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
7170: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
7180: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7190: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
71a0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
71b0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
71c0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
71d0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
71e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
71f0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
7200: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7210: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
7220: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7230: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
7240: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7250: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
7260: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
7270: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7280: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7290: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43  urn;.  if( p->nC
72a0: 6f 6c 2b 31 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  ol+1>SQLITE_MAX_
72b0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71  COLUMN ){.    sq
72c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
72d0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
72e0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
72f0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
7310: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7320: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
7330: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
7340: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
7350: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7360: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
7370: 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d  f( STRICMP(z, p-
7380: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20  >aCol[i].zName) 
7390: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
73a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
73b0: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
73c0: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
73d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
73e0: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  free(z);.      r
73f0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
7400: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
7410: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
7420: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
7430: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
7440: 33 44 62 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  3DbRealloc(pPars
7450: 65 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  e->db,p->aCol,(p
7460: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
7470: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
7480: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
7490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
74a0: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72  free(z);.      r
74b0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
74c0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
74d0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
74e0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
74f0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
7500: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
7510: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
7520: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f  zName = z;. .  /
7530: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
7540: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7550: 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68   columns have th
7560: 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69  e default affini
7570: 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20  ty.  ** 'NONE'. 
7580: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79  If there is a ty
7590: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68  pe specified, th
75a0: 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  en sqlite3AddCol
75b0: 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20  umnType() will. 
75c0: 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65   ** be called ne
75d0: 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e  xt to set pCol->
75e0: 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74  affinity correct
75f0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d  ly..  */.  pCol-
7600: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
7610: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70  TE_AFF_NONE;.  p
7620: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
7630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7640: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
7650: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
7660: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
7670: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
7680: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
7690: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
76a0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
76b0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
76c0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
76d0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
76e0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
76f0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
7700: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
7710: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
7720: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7730: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
7740: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
7750: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
7760: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7770: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7780: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7790: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
77a0: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30  ol-1;.  if( i>=0
77b0: 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f   ) p->aCol[i].no
77c0: 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b  tNull = onError;
77d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
77e0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
77f0: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
7800: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
7810: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
7820: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
7830: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
7840: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
7850: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
7860: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
7870: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
7880: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
7890: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
78a0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
78b0: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
78c0: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
78d0: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
78e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
78f0: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
7900: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
7910: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7920: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
7930: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
7940: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
7950: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
7960: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
7970: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
7980: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
7990: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
79a0: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
79b0: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
79c0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79e0: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
79f0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7a00: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
7a10: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
7a20: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7a30: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
7a40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7a50: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
7a60: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
7a70: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
7a80: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7a90: 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27  F_NONE.** 'REAL'
7aa0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7ab0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
7ac0: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
7ad0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
7ae0: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
7af0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
7b00: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
7b10: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
7b20: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
7b30: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
7b40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
7b50: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
7b60: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
7b70: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
7b80: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  st Token *pType)
7b90: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
7ba0: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
7bb0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
7bc0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
7bd0: 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79   char *zIn = pTy
7be0: 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75  pe->z;.  const u
7bf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45  nsigned char *zE
7c00: 6e 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70  nd = &pType->z[p
7c10: 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69  Type->n];..  whi
7c20: 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b  le( zIn!=zEnd ){
7c30: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20  .    h = (h<<8) 
7c40: 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  + sqlite3UpperTo
7c50: 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20  Lower[*zIn];.   
7c60: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
7c70: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
7c80: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
7c90: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
7ca0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
7cb0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7cc0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
7cd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7ce0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
7cf0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
7d00: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
7d10: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
7d20: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7d30: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
7d40: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
7d50: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
7d60: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
7d70: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
7d80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7d90: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
7da0: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
7db0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7dc0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
7dd0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
7de0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
7df0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
7e00: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
7e10: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
7e20: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7e30: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66  TE_AFF_NONE;.#if
7e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7e50: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
7e60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7e70: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
7e80: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
7e90: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
7ea0: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
7eb0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
7ec0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
7ed0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7ee0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
7ef0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
7f00: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
7f10: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
7f20: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
7f30: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
7f40: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
7f50: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
7f60: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7f70: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
7f80: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
7f90: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
7fa0: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
7fb0: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
7fc0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
7fd0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7fe0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7ff0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8000: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
8010: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
8020: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
8030: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
8040: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
8050: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8060: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8080: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8090: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
80a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
80b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
80c0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
80d0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
80e0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
80f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8100: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
8110: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
8120: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
8130: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
8140: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
8150: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
8160: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
8170: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8180: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
8190: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
81a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
81b0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
81c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
81d0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
81e0: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
81f0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
8200: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
8210: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
8220: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
8230: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
8240: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
8250: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8260: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
8270: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
8280: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8290: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
82a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
82b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
82c0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
82d0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
82e0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
82f0: 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65  Col[i];.  sqlite
8300: 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  3_free(pCol->zTy
8310: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  pe);.  pCol->zTy
8320: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
8330: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
8340: 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20  ->db, pType);.  
8350: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8360: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8370: 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a  Type(pType);.}..
8380: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
8390: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
83a0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
83b0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
83c0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
83d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
83e0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
83f0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
8400: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
8410: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
8420: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
8430: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
8440: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
8450: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
8460: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8470: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8480: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8490: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
84a0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
84b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
84c0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
84d0: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
84e0: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
84f0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
8500: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
8510: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66  lumn *pCol;.  if
8520: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8530: 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a  NewTable)!=0 ){.
8540: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
8550: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
8560: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
8570: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
8580: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
8590: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
85a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
85b0: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
85c0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
85d0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
85e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
85f0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
8610: 20 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 73   *pCopy;.      s
8620: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8630: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 73  rse->db;.      s
8640: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8650: 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20  (pCol->pDflt);. 
8660: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
8670: 20 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69 74   = pCopy = sqlit
8680: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
8690: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
86a0: 70 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20  pCopy ){.       
86b0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
86c0: 79 28 64 62 2c 20 26 70 43 6f 70 79 2d 3e 73 70  y(db, &pCopy->sp
86d0: 61 6e 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e  an, &pExpr->span
86e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
86f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
8700: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
8710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
8720: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
8730: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
8740: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
8750: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
8760: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
8770: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
8780: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
8790: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
87a0: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
87b0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
87c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
87d0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
87e0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
87f0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
8800: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
8810: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
8820: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
8830: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
8840: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
8850: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
8860: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
8870: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
8880: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
8890: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
88a0: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
88b0: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
88c0: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
88d0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
88e0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
88f0: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
8900: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
8910: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
8920: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
8930: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
8940: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
8950: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
8960: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
8970: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
8980: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
8990: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
89a0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
89b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
89c0: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
89d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
89e0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
89f0: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
8a00: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
8a10: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
8a20: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
8a30: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
8a40: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
8a50: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
8a60: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
8a70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8a80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8a90: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
8aa0: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
8ab0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
8ac0: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
8ad0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
8ae0: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
8af0: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
8b00: 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20  nt autoInc,     
8b10: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
8b20: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
8b30: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
8b40: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
8b50: 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  der     /* SQLIT
8b60: 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49  E_SO_ASC or SQLI
8b70: 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b  TE_SO_DESC */.){
8b80: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
8b90: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8ba0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
8bb0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
8bc0: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28  l = -1, i;.  if(
8bd0: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44   pTab==0 || IN_D
8be0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
8bf0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
8c00: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
8c10: 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  >hasPrimKey ){. 
8c20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8c30: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8c40: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
8c50: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
8c60: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
8c70: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
8c80: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
8c90: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
8ca0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
8cb0: 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 1;.  if( pList
8cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
8cd0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
8ce0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
8cf0: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8d00: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8d10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
8d20: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8d30: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
8d40: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
8d50: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
8d60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8d70: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
8d80: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
8d90: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8da0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
8db0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8dc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8dd0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
8de0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
8df0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
8e00: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
8e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e20: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
8e30: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
8e40: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
8e50: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
8e60: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
8e70: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
8e80: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
8e90: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
8ea0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
8eb0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
8ec0: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
8ed0: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
8ee0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
8ef0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
8f00: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
8f10: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
8f20: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
8f30: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
8f40: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
8f50: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
8f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
8f70: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
8f80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8f90: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
8fa0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
8fb0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
8fc0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
8fd0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
8fe0: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  f.  }else{.    s
8ff0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
9000: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
9010: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
9020: 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64  r, 0, 0, sortOrd
9030: 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73  er, 0);.    pLis
9040: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
9050: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
9060: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9070: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
9080: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
9090: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
90a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
90b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
90c0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
90d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
90e0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
90f0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
9100: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9110: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9120: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
9130: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
9140: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
9150: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
9160: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
9170: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9180: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9190: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
91a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
91b0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
91c0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
91d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43  .    /* The CHEC
91e0: 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  K expression mus
91f0: 74 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20  t be duplicated 
9200: 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72  so that tokens r
9210: 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  efer.    ** to m
9220: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e  alloced space an
9230: 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d  d not the (ephem
9240: 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68  eral) text of th
9250: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20  e CREATE TABLE. 
9260: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
9270: 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  */.    pTab->pCh
9280: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
9290: 72 41 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e 70  rAnd(db, pTab->p
92a0: 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20  Check, .        
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
92d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 68  3ExprDup(db, pCh
92e0: 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23  eckExpr));.  }.#
92f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
9300: 78 70 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b  xprDelete(pCheck
9310: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
9320: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
9330: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
9340: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9350: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
9360: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
9370: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
9380: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9390: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
93a0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
93b0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c  *pToken){.  Tabl
93c0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
93d0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
93e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
93f0: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
9400: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9410: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 20 3d  e */..  if( (p =
9420: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9430: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
9440: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
9450: 3b 0a 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  zColl = sql
9460: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9470: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  n(pParse->db, pT
9480: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43  oken);.  if( !zC
9490: 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  oll ) return;.. 
94a0: 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61   if( sqlite3Loca
94b0: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
94c0: 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a  , zColl, -1) ){.
94d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
94e0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
94f0: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
9500: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
9510: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
9520: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
9530: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
9540: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
9550: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
9560: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
9570: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
9580: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
9590: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
95a0: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
95b0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
95c0: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
95d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
95e0: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
95f0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9600: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
9610: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
9620: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
9630: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
9640: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
9650: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
9660: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
9670: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
9680: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
9690: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
96a0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  (zColl);.  }.}..
96b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
96c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
96d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
96e0: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
96f0: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
9700: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
9710: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
9720: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
9730: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
9740: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
9750: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9760: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9770: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
9780: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
9790: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
97a0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
97b0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
97c0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
97d0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
97e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
97f0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
9800: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
9810: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
9820: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
9830: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
9840: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
9850: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
9860: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
9870: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
9880: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
9890: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
98a0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
98b0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
98c0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
98d0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
98e0: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
98f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
9900: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
9910: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
9920: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
9930: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
9940: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
9950: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
9960: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
9970: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9980: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
9990: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
99a0: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
99b0: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
99c0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f 6c   message..*/.Col
99d0: 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63  lSeq *sqlite3Loc
99e0: 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ateCollSeq(Parse
99f0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
9a00: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
9a10: 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74   nName){.  sqlit
9a20: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9a30: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
9a40: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
9a50: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
9a60: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
9a70: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
9a80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9a90: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
9aa0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
9ab0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
9ac0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
9ad0: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
9ae0: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
9af0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
9b00: 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c  ollSeq(db, pColl
9b10: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
9b20: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
9b30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61  ){.      if( nNa
9b40: 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  me<0 ){.        
9b50: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
9b60: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
9b70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9b80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
9b90: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
9ba0: 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c  sequence: %.*s",
9bb0: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a   nName, zName);.
9bc0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b        pColl = 0;
9bd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
9be0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
9bf0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
9c00: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
9c10: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
9c20: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
9c30: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
9c40: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
9c50: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
9c60: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
9c70: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
9c80: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
9c90: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
9ca0: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
9cb0: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
9cc0: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
9cd0: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
9ce0: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
9cf0: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
9d00: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
9d10: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
9d20: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
9d30: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
9d40: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
9d50: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
9d60: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
9d70: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
9d80: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
9d90: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
9da0: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
9db0: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
9dc0: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
9dd0: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
9de0: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
9df0: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
9e00: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
9e10: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
9e20: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
9e30: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
9e40: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
9e50: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
9e60: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
9e70: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
9e80: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
9e90: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
9ea0: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
9eb0: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
9ec0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
9ed0: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
9ee0: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20  3 *db, Vdbe *v, 
9ef0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
9f00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9f10: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
9f20: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
9f30: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
9f40: 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  +1, 0);.  sqlite
9f50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9f60: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
9f70: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  , 0);.}../*.** M
9f80: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
9f90: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
9fa0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
9fb0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
9fc0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
9fd0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
9fe0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
9ff0: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
a000: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
a010: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
a020: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
a030: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
a040: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
a050: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
a060: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
a070: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
a080: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
a090: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
a0a0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
a0b0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
a0c0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
a0d0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
a0e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a0f0: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
a100: 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66  Write an identif
a110: 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ier onto the end
a120: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   of the given st
a130: 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75  ring.  Add.** qu
a140: 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61  ote characters a
a150: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  s needed..*/.sta
a160: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
a170: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
a180: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67  pIdx, char *zSig
a190: 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73  nedIdent){.  uns
a1a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65  igned char *zIde
a1b0: 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  nt = (unsigned c
a1c0: 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e  har*)zSignedIden
a1d0: 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  t;.  int i, j, n
a1e0: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
a1f0: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
a200: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
a210: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
a220: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
a230: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
a240: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
a250: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
a260: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
a270: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
a2a0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
a2b0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
a2c0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
a2d0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
a2e0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
a2f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
a300: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
a310: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
a320: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
a330: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
a340: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
a350: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
a360: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
a370: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
a380: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
a390: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
a3a0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
a3b0: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
a3c0: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
a3d0: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
a3e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
a3f0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
a400: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
a410: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
a420: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
a430: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
a440: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
a450: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
a460: 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70 29 7b  *p, int isTemp){
a470: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
a480: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
a490: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
a4a0: 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a  ep2, *zEnd, *z;.
a4b0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a4c0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
a4d0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
a4e0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
a4f0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
a500: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
a510: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  h(pCol->zName);.
a520: 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54      z = pCol->zT
a530: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  ype;.    if( z )
a540: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74  {.      n += (st
a550: 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20  rlen(z) + 1);.  
a560: 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69    }.  }.  n += i
a570: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
a580: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
a590: 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22   ){.    zSep = "
a5a0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
a5b0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
a5c0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
a5d0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
a5e0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
a5f0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
a600: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
a610: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
a620: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
a630: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b  te3_malloc( n );
a640: 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20  .  if( zStmt==0 
a650: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
a660: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
a670: 2c 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20  , zStmt,.       
a680: 20 20 20 20 20 20 20 20 20 20 20 21 4f 4d 49 54             !OMIT
a690: 5f 54 45 4d 50 44 42 26 26 69 73 54 65 6d 70 20  _TEMPDB&&isTemp 
a6a0: 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  ? "CREATE TEMP T
a6b0: 41 42 4c 45 20 22 3a 22 43 52 45 41 54 45 20 54  ABLE ":"CREATE T
a6c0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
a6d0: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
a6e0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a6f0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
a700: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
a710: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
a720: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
a730: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
a740: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a750: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
a760: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
a770: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
a780: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
a790: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
a7a0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
a7b0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
a7c0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
a7d0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
a7e0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
a7f0: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
a800: 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65     assert( strle
a810: 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a 20  n(z)+k+1<=n );. 
a820: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
a830: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
a840: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  t[k], "%s", z);.
a850: 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65        k += strle
a860: 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n(z);.    }.  }.
a870: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a880: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
a890: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
a8a0: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
a8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a8c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a8d0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
a8e0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
a8f0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
a900: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a910: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
a920: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
a930: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
a940: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
a950: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
a960: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
a970: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
a980: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
a990: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
a9a0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
a9b0: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
a9c0: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
a9d0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
a9e0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
a9f0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
aa00: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
aa10: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
aa20: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
aa30: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
aa40: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
aa50: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
aa60: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
aa70: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
aa80: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
aa90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
aaa0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
aab0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
aac0: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
aad0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
aae0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
aaf0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
ab00: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
ab10: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ab20: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
ab30: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
ab40: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
ab50: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
ab60: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
ab70: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
ab80: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ab90: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
aba0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
abb0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
abc0: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
abd0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
abe0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
abf0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ac00: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
ac10: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
ac20: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
ac30: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
ac40: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
ac50: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
ac60: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ac70: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
ac80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
ac90: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
aca0: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
acb0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
acc0: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
acd0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
ace0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
acf0: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
ad00: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
ad10: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
ad20: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
ad30: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
ad40: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
ad50: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
ad60: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
ad70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ad80: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
ad90: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
ada0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
adb0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
adc0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
add0: 6c 65 64 20 29 20 7b 0a 20 20 20 20 72 65 74 75  led ) {.    retu
ade0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50  rn;.  }.  p = pP
adf0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ae00: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ae10: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
ae20: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
ae30: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
ae40: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
ae50: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
ae60: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
ae70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ae80: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
ae90: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
aea0: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
aeb0: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
aec0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
aed0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63  Check ){.    Src
aee0: 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20  List sSrc;      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af00: 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72  Fake SrcList for
af10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
af20: 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  le */.    NameCo
af30: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
af40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
af50: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50  e context for pP
af60: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
af70: 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  */..    memset(&
af80: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
af90: 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  NC));.    memset
afa0: 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f  (&sSrc, 0, sizeo
afb0: 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53  f(sSrc));.    sS
afc0: 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20  rc.nSrc = 1;.   
afd0: 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65   sSrc.a[0].zName
afe0: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   = p->zName;.   
aff0: 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20   sSrc.a[0].pTab 
b000: 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b  = p;.    sSrc.a[
b010: 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  0].iCursor = -1;
b020: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
b030: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
b040: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53  C.pSrcList = &sS
b050: 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68  rc;.    sNC.isCh
b060: 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  eck = 1;.    if(
b070: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
b080: 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
b090: 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20  ->pCheck) ){.   
b0a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
b0b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
b0c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b0d0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
b0e0: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
b0f0: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
b100: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
b110: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
b120: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
b130: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
b140: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
b150: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
b160: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
b170: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
b180: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
b190: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
b1a0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
b1b0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
b1c0: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
b1d0: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
b1e0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
b1f0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
b200: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
b210: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
b220: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
b230: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
b240: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
b250: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
b260: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
b270: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
b280: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
b290: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
b2a0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b2b0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
b2c0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b2d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
b2e0: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
b2f0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
b300: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
b310: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
b320: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
b330: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
b340: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
b350: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
b360: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
b370: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
b380: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
b390: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
b3a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
b3b0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
b3c0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
b3d0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
b3e0: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
b3f0: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
b400: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
b410: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
b420: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
b430: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
b440: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
b450: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
b460: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
b470: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
b480: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
b490: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b4a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
b4b0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b4c0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
b4d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
b4e0: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
b4f0: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
b500: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
b510: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
b520: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
b530: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
b540: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
b550: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
b560: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
b570: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
b580: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
b590: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
b5a0: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
b5b0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
b5c0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
b5d0: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
b5e0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
b5f0: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
b600: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
b610: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
b620: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
b630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b640: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
b650: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
b660: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b670: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
b680: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b690: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b6a0: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b6b0: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b6c0: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b6d0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b6e0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b6f0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b700: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b710: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b720: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b730: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b740: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b750: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b760: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b770: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b780: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b790: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b7a0: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b7b0: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b7c0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b7d0: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b7e0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b7f0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
b800: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
b810: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
b820: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
b830: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
b840: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
b850: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
b860: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
b870: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
b880: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
b890: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
b8a0: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
b8b0: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
b8c0: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
b8d0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
b8e0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
b8f0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
b900: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b910: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
b920: 73 74 20 64 65 73 74 20 3d 20 7b 53 52 54 5f 54  st dest = {SRT_T
b930: 61 62 6c 65 2c 20 31 2c 20 30 7d 3b 0a 20 20 20  able, 1, 0};.   
b940: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
b950: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
b960: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
b970: 5f 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 73 71  _Copy);.      sq
b980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b990: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
b9a0: 20 31 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20   1, 0, iDb);.   
b9b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
b9c0: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
b9d0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
b9e0: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c   pSelect, &dest,
b9f0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
ba00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ba10: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
ba20: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
ba30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
ba40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
ba50: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
ba60: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
ba70: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
ba80: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
ba90: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
baa0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
bab0: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
bac0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
bad0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
bae0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
baf0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
bb00: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
bb10: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
bb20: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
bb30: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
bb40: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
bb50: 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a  Table(pSelTab);.
bb60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
bb70: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bb80: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
bb90: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
bba0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
bbb0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
bbc0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
bbd0: 74 65 54 61 62 6c 65 53 74 6d 74 28 70 2c 20 70  teTableStmt(p, p
bbe0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
bbf0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
bc00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc10: 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70   n = pEnd->z - p
bc20: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
bc30: 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a  n.z + 1;.      z
bc40: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
bc50: 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
bc60: 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
bc70: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
bc80: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
bc90: 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
bca0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
bcb0: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
bcc0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
bcd0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
bce0: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
bcf0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
bd00: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
bd10: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
bd20: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
bd30: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
bd40: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
bd50: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
bd60: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
bd70: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
bd80: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
bd90: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
bda0: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
bdb0: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
bdc0: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
bdd0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
bde0: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
bdf0: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
be00: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
be10: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
be20: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
be30: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
be40: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
be50: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
be60: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
be70: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
be80: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
be90: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
bea0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
beb0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
bec0: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
bed0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
bee0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
bef0: 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
bf00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
bf10: 72 65 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20  ree(zStmt);.    
bf20: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
bf30: 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
bf40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
bf50: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
bf60: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
bf70: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
bf80: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
bf90: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
bfa0: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
bfb0: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
bfc0: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
bfd0: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
bfe0: 20 69 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20   if( p->autoInc 
bff0: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
c000: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
c010: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
c020: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
c030: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
c040: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
c050: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
c060: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
c070: 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
c080: 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
c090: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
c0a0: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  >zName.        )
c0b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c0c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
c0d0: 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
c0e0: 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
c0f0: 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
c100: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
c110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c120: 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(v, OP_ParseSch
c130: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a  ema, iDb, 0, 0,.
c140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
c150: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
c160: 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e  name='%q'",p->zN
c170: 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43  ame), P4_DYNAMIC
c180: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
c190: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
c1a0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
c1b0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
c1c0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
c1d0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
c1e0: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
c1f0: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
c200: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
c210: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20   FKey *pFKey; . 
c220: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
c230: 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
c240: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
c250: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
c260: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
c270: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
c280: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29  n(p->zName)+1,p)
c290: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
c2a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c2b0: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
c2c0: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
c2d0: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
c2e0: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
c2f0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
c300: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
c310: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23 69  return;.    }.#i
c320: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c330: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
c340: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
c350: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
c360: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
c370: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  rom){.      void
c380: 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20 69 6e   *data;.      in
c390: 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70  t nTo = strlen(p
c3a0: 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  FKey->zTo) + 1;.
c3b0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65        pFKey->pNe
c3c0: 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61  xtTo = sqlite3Ha
c3d0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
c3e0: 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a  >aFKey, pFKey->z
c3f0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
c400: 64 61 74 61 20 3d 20 73 71 6c 69 74 65 33 48 61  data = sqlite3Ha
c410: 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
c420: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  a->aFKey, pFKey-
c430: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79  >zTo, nTo, pFKey
c440: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 61 74  );.      if( dat
c450: 61 3d 3d 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  a==(void *)pFKey
c460: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   ){.        db->
c470: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c490: 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
c4a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
c4b0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
c4c0: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
c4d0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
c4e0: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
c4f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c500: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
c510: 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
c520: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
c530: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
c540: 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
c550: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
c560: 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
c570: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
c580: 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
c590: 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
c5a0: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
c5b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
c5c0: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
c5d0: 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
c5e0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
c5f0: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 3b  Cons->z - zName;
c600: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
c610: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
c620: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
c630: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
c640: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c650: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c660: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
c670: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
c680: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
c690: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
c6a0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
c6b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
c6c0: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
c6d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
c6e0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
c6f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
c700: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
c710: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
c720: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
c730: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
c740: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
c750: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
c760: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
c770: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
c780: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
c790: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
c7a0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
c7b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
c7c0: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
c7d0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
c7e0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
c7f0: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
c800: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
c810: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
c820: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
c830: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
c840: 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
c850: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
c860: 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
c870: 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
c880: 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
c890: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
c8a0: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
c8b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
c8c0: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
c8d0: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
c8e0: 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
c8f0: 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  me;.  int iDb;. 
c900: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c910: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
c920: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
c930: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c940: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c950: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
c960: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
c970: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
c980: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c990: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c9a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
c9b0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
c9c0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
c9d0: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
c9e0: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
c9f0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
ca00: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
ca10: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
ca20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
ca30: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
ca40: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
ca50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
ca60: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
ca70: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
ca80: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
ca90: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
caa0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
cab0: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
cac0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
cad0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
cae0: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
caf0: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
cb00: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
cb10: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
cb20: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
cb30: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
cb40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cb50: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
cb60: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
cb70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cb80: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
cb90: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
cba0: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
cbb0: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
cbc0: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
cbd0: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
cbe0: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
cbf0: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
cc00: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
cc10: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
cc20: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
cc30: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
cc40: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
cc50: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
cc60: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
cc70: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
cc80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
cc90: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  , pSelect);.  sq
cca0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
ccb0: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
ccc0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ccd0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
cce0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
ccf0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
cd00: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
cd10: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
cd20: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
cd30: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
cd40: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
cd50: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
cd60: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
cd70: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
cd80: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
cd90: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
cda0: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
cdb0: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
cdc0: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
cdd0: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
cde0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
cdf0: 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20  0;.  n = sEnd.z 
ce00: 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  - pBegin->z;.  z
ce10: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
ce20: 65 64 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d  ed char*)pBegin-
ce30: 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  >z;.  while( n>0
ce40: 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27   && (z[n-1]==';'
ce50: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   || isspace(z[n-
ce60: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
ce70: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
ce80: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
ce90: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
cea0: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
ceb0: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
cec0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
ced0: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
cee0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
cef0: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
cf00: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
cf10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
cf20: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
cf30: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
cf40: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
cf50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cf60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cf70: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
cf80: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
cf90: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
cfa0: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
cfb0: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
cfc0: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
cfd0: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
cfe0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
cff0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d000: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
d010: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
d020: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
d030: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d040: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
d050: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d060: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
d070: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d080: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
d090: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
d0a0: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
d0b0: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
d0c0: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
d0d0: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
d0e0: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
d0f0: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
d100: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
d110: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
d120: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
d130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d140: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
d150: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
d160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
d170: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
d180: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
d190: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
d1a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d1b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
d1c0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d1d0: 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
d1e0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
d1f0: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
d200: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
d210: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d220: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d230: 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r*);..  assert( 
d240: 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
d250: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d260: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
d270: 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  ( sqlite3VtabCal
d280: 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
d290: 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20   pTable) ){.    
d2a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
d2b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  ROR;.  }.  if( I
d2c0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
d2d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
d2e0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
d2f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
d300: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
d310: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
d320: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
d330: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
d340: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
d350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
d360: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
d370: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
d380: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
d390: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
d3a0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
d3b0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
d3c0: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
d3d0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
d3e0: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
d3f0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
d400: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
d410: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
d420: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
d430: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
d440: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
d450: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
d460: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
d470: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
d480: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
d490: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
d4a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
d4b0: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
d4c0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
d4d0: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
d4e0: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
d4f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
d500: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
d510: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
d520: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
d530: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
d540: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
d550: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
d560: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
d570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d580: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
d590: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
d5a0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
d5b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
d5c0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d5d0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20  pTable->nCol>=0 
d5e0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  );..  /* If we g
d5f0: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
d600: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
d610: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
d620: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
d630: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
d640: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
d650: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
d660: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
d670: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
d680: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
d690: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
d6a0: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
d6b0: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
d6c0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
d6d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
d6e0: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
d6f0: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
d700: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
d710: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
d720: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
d730: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
d740: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
d750: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
d760: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
d770: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
d780: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
d790: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
d7a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
d7b0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
d7c0: 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ect);.  if( pSel
d7d0: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
d7e0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
d7f0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
d800: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
d810: 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
d820: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
d830: 3d 20 2d 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  = -1;.#ifndef SQ
d840: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
d850: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74  IZATION.    xAut
d860: 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
d870: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
d880: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
d890: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
d8a0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
d8b0: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64   0, pSel);.    d
d8c0: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
d8d0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
d8e0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
d8f0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
d900: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b  Parse, 0, pSel);
d910: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
d920: 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
d930: 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
d940: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d950: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
d960: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d970: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
d980: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
d990: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
d9a0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
d9b0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
d9c0: 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
d9d0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
d9e0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
d9f0: 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20  able(pSelTab);. 
da00: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63       pTable->pSc
da10: 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44  hema->flags |= D
da20: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
da30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
da50: 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
da60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
da70: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
da80: 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Sel);.  } else {
da90: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
daa0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
dab0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
dac0: 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
dad0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
dae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
daf0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
db00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
db10: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
db20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
db30: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
db40: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
db50: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
db60: 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
db70: 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
db80: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
db90: 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
dba0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
dbb0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
dbc0: 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
dbd0: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
dbe0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
dbf0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
dc00: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
dc10: 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
dc20: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
dc30: 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
dc40: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
dc50: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
dc60: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
dc70: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
dc80: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
dc90: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
dca0: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
dcb0: 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
dcc0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
dcd0: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
dce0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
dcf0: 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
dd00: 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
dd10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
dd20: 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
dd30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
dd40: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
dd50: 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
dd60: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
dd70: 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
dd80: 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
dd90: 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
dda0: 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
ddb0: 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
ddc0: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
ddd0: 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
dde0: 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
ddf0: 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
de00: 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
de10: 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
de20: 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
de30: 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
de40: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
de50: 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
de60: 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
de70: 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
de80: 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
de90: 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
dea0: 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
deb0: 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
dec0: 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
ded0: 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
dee0: 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
def0: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
df00: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
df10: 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
df20: 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
df30: 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
df40: 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
df50: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
df60: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
df70: 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
df80: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
df90: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
dfa0: 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
dfb0: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
dfc0: 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
dfd0: 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
dfe0: 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
dff0: 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
e000: 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
e010: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
e020: 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
e030: 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
e040: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
e050: 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
e060: 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
e070: 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
e080: 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
e090: 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
e0a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e0b0: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
e0c0: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
e0d0: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
e0e0: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
e0f0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
e100: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
e110: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
e120: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
e130: 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
e140: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
e150: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
e160: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
e170: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
e180: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e190: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
e1a0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
e1b0: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
e1c0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
e1d0: 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
e1e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
e1f0: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
e200: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
e210: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
e220: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
e230: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
e240: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
e250: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
e260: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
e270: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
e280: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
e290: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
e2a0: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
e2b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
e2c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
e2d0: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
e2e0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
e2f0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
e300: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
e310: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
e320: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
e330: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e340: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
e350: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
e360: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
e370: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
e380: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
e390: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
e3a0: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
e3b0: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
e3c0: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
e3d0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
e3e0: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
e3f0: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
e400: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
e410: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
e420: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
e430: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
e440: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73  dbe(pParse);.  s
e450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e460: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
e470: 69 54 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69  iTable, iDb);.#i
e480: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e490: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
e4a0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73  * OP_Destroy pus
e4b0: 68 65 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  hes an integer o
e4c0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49  nto the stack. I
e4d0: 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
e4e0: 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
e4f0: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
e500: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
e510: 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
e520: 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
e530: 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
e540: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
e550: 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
e560: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
e570: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
e580: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
e590: 68 65 20 22 23 30 22 20 69 6e 20 74 68 65 20 53  he "#0" in the S
e5a0: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
e5b0: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
e5c0: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
e5d0: 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68  ue.  ** is on th
e5e0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
e5f0: 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ck.  See sqlite3
e600: 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a  RegisterExpr()..
e610: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
e620: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
e630: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
e640: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
e650: 67 65 3d 25 64 20 57 48 45 52 45 20 23 30 20 41  ge=%d WHERE #0 A
e660: 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c  ND rootpage=#0",
e670: 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62  .     pParse->db
e680: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
e690: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
e6a0: 44 62 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65  Db), iTable);.#e
e6b0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ndif.}../*.** Wr
e6c0: 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
e6d0: 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
e6e0: 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
e6f0: 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
e700: 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
e710: 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
e720: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
e730: 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
e740: 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
e750: 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
e760: 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
e770: 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
e780: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
e790: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
e7a0: 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
e7b0: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
e7c0: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
e7d0: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
e7e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
e7f0: 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
e800: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
e810: 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
e820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e830: 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
e840: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20  pIdx;.  int iDb 
e850: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
e860: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
e870: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
e880: 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  );.  destroyRoot
e890: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
e8a0: 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  b->tnum, iDb);. 
e8b0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
e8c0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
e8d0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e8e0: 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
e8f0: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64  Page(pParse, pId
e900: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
e910: 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66   }.#else.  /* If
e920: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
e930: 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
e940: 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
e950: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e960: 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
e970: 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
e980: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
e990: 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
e9a0: 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
e9b0: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
e9c0: 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
e9d0: 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
e9e0: 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
e9f0: 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
ea00: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
ea10: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
ea20: 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
ea30: 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
ea40: 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
ea50: 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
ea60: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
ea70: 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
ea80: 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
ea90: 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
eaa0: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
eab0: 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
eac0: 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
ead0: 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
eae0: 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
eaf0: 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
eb00: 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
eb10: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
eb20: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
eb30: 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
eb40: 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
eb50: 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
eb60: 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
eb70: 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
eb80: 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
eb90: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
eba0: 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
ebb0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
ebc0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
ebd0: 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
ebe0: 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
ebf0: 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
ec00: 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
ec10: 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
ec20: 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
ec30: 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
ec40: 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
ec50: 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
ec60: 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
ec70: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
ec80: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
ec90: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
eca0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
ecb0: 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
ecc0: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
ecd0: 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
ece0: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
ecf0: 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ma );.      if( 
ed00: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
ed10: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
ed20: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
ed30: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
ed40: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
ed50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed60: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
ed70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
ed80: 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
ed90: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
eda0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
edb0: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
edc0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
edd0: 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f  .      destroyRo
ede0: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69  otPage(pParse, i
edf0: 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20  Largest, iDb);. 
ee00: 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20       iDestroyed 
ee10: 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20  = iLargest;.    
ee20: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
ee30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ee40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
ee50: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
ee60: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
ee70: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
ee80: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
ee90: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
eea0: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
eeb0: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
eec0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
eed0: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
eee0: 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20  int isView, int 
eef0: 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20  noErr){.  Table 
ef00: 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
ef10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ef20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ef30: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
ef40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
ef50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ef60: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
ef70: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ef80: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
ef90: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
efa0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
efb0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
efc0: 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
efd0: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
efe0: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
eff0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
f000: 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a     if( noErr ){.
f010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f020: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
f030: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
f040: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f050: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
f060: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f070: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
f080: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
f090: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
f0a0: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
f0b0: 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
f0c0: 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
f0d0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
f0e0: 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
f0f0: 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
f100: 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
f110: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
f120: 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
f130: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
f140: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
f150: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f160: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
f170: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f180: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f190: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
f1a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f1b0: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
f1c0: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
f1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
f1e0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
f1f0: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
f200: 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
f210: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f220: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f230: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f240: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
f250: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f260: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
f270: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
f280: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
f290: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
f2a0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
f2b0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f2c0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
f2d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f2e0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f2f0: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
f300: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f310: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f320: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
f330: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f340: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
f350: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f360: 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
f370: 72 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64  rg2 = pTab->pMod
f380: 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f3b0: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
f3c0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f3d0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
f3e0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
f3f0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
f400: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
f410: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
f420: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
f430: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
f440: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
f450: 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
f460: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
f470: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f490: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f4a0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f4b0: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
f4c0: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
f4d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f4e0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
f4f0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
f500: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
f510: 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61  y || pTab==db->a
f520: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
f530: 3e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  >pSeqTab ){.    
f540: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f550: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
f560: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
f570: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
f580: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
f590: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f5a0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
f5b0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
f5c0: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
f5d0: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
f5e0: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
f5f0: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
f600: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
f610: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
f620: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
f630: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
f640: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f650: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
f660: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
f670: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
f680: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f690: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f6a0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
f6b0: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
f6c0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
f6d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f6e0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
f6f0: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
f700: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
f710: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
f720: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f730: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
f740: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
f750: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
f760: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
f770: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
f780: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
f790: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
f7a0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f7b0: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
f7c0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
f7d0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
f7e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
f7f0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
f800: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
f810: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
f820: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f830: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
f840: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
f850: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
f860: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
f870: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f880: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29  );.      if( v )
f890: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f8a0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
f8b0: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20  P_VBegin);.     
f8c0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
f8d0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
f8e0: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
f8f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
f900: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
f910: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
f920: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
f930: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
f940: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
f950: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
f960: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
f970: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
f980: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
f990: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
f9a0: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
f9b0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
f9c0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
f9d0: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
f9e0: 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
f9f0: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
fa00: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
fa10: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
fa20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
fa30: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
fa40: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
fa50: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
fa60: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
fa70: 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
fa80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fa90: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
faa0: 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
fab0: 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
fac0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
fad0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
fae0: 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
faf0: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
fb00: 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
fb10: 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
fb20: 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
fb30: 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
fb40: 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
fb50: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
fb60: 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
fb70: 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
fb80: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
fb90: 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
fba0: 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
fbb0: 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
fbc0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74     if( pTab->aut
fbd0: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71  oInc ){.      sq
fbe0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
fbf0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
fc00: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
fc10: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
fc20: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
fc30: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
fc40: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
fc50: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
fc60: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
fc70: 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
fc80: 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
fc90: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
fca0: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
fcb0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
fcc0: 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
fcd0: 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
fce0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
fcf0: 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
fd00: 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
fd10: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
fd20: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
fd30: 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
fd40: 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
fd50: 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
fd60: 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
fd70: 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
fd80: 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
fd90: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
fda0: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
fdb0: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
fdc0: 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
fdd0: 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
fde0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
fdf0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
fe00: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
fe10: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
fe20: 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
fe30: 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
fe40: 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
fe50: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
fe60: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
fe70: 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
fe80: 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
fe90: 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
fea0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
feb0: 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
fec0: 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
fed0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
fee0: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
fef0: 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
ff00: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
ff10: 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
ff20: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
ff30: 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ie..    */.    i
ff40: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
ff50: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
ff60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ff70: 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
ff80: 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
ff90: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
ffa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ffb0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
ffc0: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
ffd0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
ffe0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
fff0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
10000 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
10010 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
10020 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
10030 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
10040 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
10050 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
10060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10070 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
10080 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
10090 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
100a0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
100b0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
100c0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
100d0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
100e0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
100f0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
10100 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
10110 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
10120 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
10130 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
10140 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
10150 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
10160 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
10170 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
10180 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
10190 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
101a0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
101b0 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
101c0 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
101d0 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
101e0 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
101f0 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
10200 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
10210 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
10220 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
10230 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
10240 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
10250 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
10260 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
10270 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
10280 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
10290 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
102a0 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
102b0 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
102c0 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
102d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
102e0 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
102f0 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
10300 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
10310 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
10320 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
10330 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
10340 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64  until sqlite3End
10350 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
10360 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
10370 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
10380 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
10390 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
103a0 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
103b0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
103c0 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
103d0 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
103e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
103f0 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
10400 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10410 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
10420 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10430 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
10440 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
10450 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
10460 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
10470 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
10480 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
10490 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
104a0 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
104b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
104c0 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
104d0 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
104e0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
104f0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
10500 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
10510 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
10520 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  s. */.){.#ifndef
10530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10540 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
10550 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
10560 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
10570 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
10580 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
10590 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
105a0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
105b0 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
105c0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
105d0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44  se->nErr || IN_D
105e0 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
105f0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
10600 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
10610 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
10620 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
10630 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20  ( iCol<0 ) goto 
10640 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
10650 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
10660 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
10670 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10680 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
10690 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
106a0 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
106b0 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
106c0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
106d0 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
106e0 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
106f0 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
10700 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
10710 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
10720 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
10730 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
10740 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
10750 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
10760 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10770 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10780 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
10790 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
107a0 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
107b0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
107c0 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
107d0 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
107e0 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
107f0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
10800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
10810 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
10820 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
10830 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
10840 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70   + nCol*sizeof(p
10850 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
10860 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
10870 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
10880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
10890 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
108a0 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
108b0 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61  strlen(pToCol->a
108c0 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
108d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
108e0 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
108f0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
10900 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
10910 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20  f( pFKey==0 ){. 
10920 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
10930 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72    }.  pFKey->pFr
10940 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
10950 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
10960 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
10970 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20  ar*)&pFKey[1];. 
10980 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28   pFKey->aCol = (
10990 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29  struct sColMap*)
109a0 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66  z;.  z += sizeof
109b0 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29  (struct sColMap)
109c0 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e  *nCol;.  pFKey->
109d0 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
109e0 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
109f0 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
10a00 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54  ] = 0;.  z += pT
10a10 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
10a20 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20  >pNextTo = 0;.  
10a30 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
10a40 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
10a50 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
10a60 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
10a70 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
10a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
10a90 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
10aa0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
10ab0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
10ac0 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
10ad0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
10ae0 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
10af0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
10b00 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
10b10 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
10b20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
10b30 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
10b40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10b60 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
10b70 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
10b80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10b90 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
10ba0 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
10bb0 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
10bc0 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
10bd0 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
10be0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
10bf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
10c00 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
10c10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10c20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
10c30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
10c40 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10c50 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
10c60 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
10c70 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
10c80 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
10c90 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
10ca0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
10cb0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
10cc0 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
10cd0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
10ce0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
10cf0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
10d00 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
10d10 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
10d20 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
10d30 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
10d40 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
10d50 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
10d60 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
10d70 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
10d80 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
10d90 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
10da0 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
10db0 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
10dc0 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
10dd0 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
10de0 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  nd:.  sqlite3_fr
10df0 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
10e00 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10e10 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10e20 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
10e30 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
10e40 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
10e50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
10e60 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
10e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10e80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
10e90 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
10ea0 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
10eb0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
10ec0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
10ed0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
10ee0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
10ef0 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
10f00 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
10f10 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
10f20 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
10f30 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
10f40 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
10f50 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
10f60 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
10f70 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
10f80 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
10f90 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
10fa0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
10fb0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
10fc0 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
10fd0 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
10fe0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10ff0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11000 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
11010 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
11020 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
11030 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11040 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
11050 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
11060 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
11070 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
11080 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
11090 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
110a0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
110b0 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
110c0 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
110d0 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
110e0 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
110f0 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
11100 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
11110 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
11120 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
11130 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
11140 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
11150 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
11160 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
11170 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
11180 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
11190 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
111a0 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d  reated.  The mem
111b0 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69  ory cell specifi
111c0 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
111d0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
111e0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
111f0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
11200 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
11210 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
11220 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
11230 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
11240 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
11250 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
11260 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
11270 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
11280 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
11290 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
112a0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
112b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
112c0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
112d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
112e0 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
112f0 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
11300 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11310 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
11320 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
11330 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
11340 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
11350 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20  arse->nTab;     
11360 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
11370 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
11380 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
11390 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20  pParse->nTab+1; 
113a0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
113b0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
113c0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
113d0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
113e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
113f0 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
11400 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
11430 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
11440 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11470 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
11480 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
11490 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
114b0 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
114c0 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dex */.  sqlite3
114d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
114e0 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
114f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11500 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
11510 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11520 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
11530 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
11540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11550 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
11560 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
11570 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
11580 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
11590 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
115a0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
115b0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
115c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
115d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
115e0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
115f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
11600 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
11610 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
11620 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
11630 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
11640 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
11650 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
11660 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11670 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
11680 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
11690 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
116a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
116b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
116c0 53 43 6f 70 79 2c 20 6d 65 6d 52 6f 6f 74 50 61  SCopy, memRootPa
116d0 67 65 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  ge);.    tnum = 
116e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
116f0 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
11700 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
11710 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11720 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
11730 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  b);.  }.  pKey =
11740 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
11750 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e  info(pParse, pIn
11760 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dex);.  sqlite3V
11770 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11780 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
11790 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
117c0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
117d0 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65  F);.  sqlite3Ope
117e0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
117f0 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
11800 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
11810 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
11820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11830 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
11840 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ;.  sqlite3Gener
11850 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
11860 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20 20  Index, iTab);.  
11870 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
11880 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
11890 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72 20      int curaddr 
118a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
118b0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
118c0 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75 72   int addr2 = cur
118d0 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c 69  addr+4;.    sqli
118e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
118f0 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61 64  v, curaddr-1, ad
11900 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr2);.    sqlite
11910 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11920 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 29 3b 0a  P_Rowid, iTab);.
11930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11940 64 64 4f 70 31 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp1(v, OP_AddI
11950 6d 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  mm, 1);.    sqli
11960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11970 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49   OP_IsUnique, iI
11980 64 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  dx, addr2);.    
11990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
119a0 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
119b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
119c0 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20   OE_Abort, 0,.  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
119f0 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
11a00 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  e", P4_STATIC);.
11a10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
11a20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
11a30 61 64 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64  addr2==sqlite3Vd
11a40 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11a50 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
11a60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11a70 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
11a80 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  x, 0);.  sqlite3
11a90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11aa0 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
11ab0 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r1+1);.  sqlite3
11ac0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11ad0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
11ae0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11af0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
11b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11b10 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
11b20 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iIdx);.}../*.**
11b30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
11b40 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
11b50 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
11b60 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
11b70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
11b80 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
11b90 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11ba0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
11bb0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11bc0 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
11bd0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
11be0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
11bf0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
11c00 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
11c10 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
11c20 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
11c30 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
11c40 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
11c50 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
11c60 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
11c70 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
11c80 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
11c90 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
11ca0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
11cb0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11cc0 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
11cd0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
11ce0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
11cf0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11d00 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
11d10 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
11d20 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
11d30 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11d40 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
11d50 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
11d60 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
11d70 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
11d80 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
11d90 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
11da0 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
11db0 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
11dc0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11dd0 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
11de0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
11df0 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
11e00 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
11e10 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
11e20 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
11e30 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
11e40 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
11e50 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
11e60 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
11e70 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
11e80 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
11e90 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
11ea0 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
11eb0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
11ec0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11ed0 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
11ee0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
11ef0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11f00 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
11f10 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
11f20 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
11f30 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
11f40 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
11f50 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
11f60 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
11f70 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
11f80 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
11f90 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
11fa0 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
11fb0 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
11fc0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11fd0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
11fe0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
11ff0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
12000 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
12010 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
12020 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
12030 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
12040 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
12050 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
12060 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
12070 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
12080 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
12090 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
120a0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
120b0 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
120c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
120d0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
120e0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
120f0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
12100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12110 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
12120 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
12130 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
12140 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
12150 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
12160 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
12170 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
12180 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
12190 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
121a0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
121b0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
121c0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
121d0 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
121e0 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
121f0 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
12200 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12210 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
12220 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
12230 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
12240 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
12250 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
12260 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
12270 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
12280 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
12290 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
122a0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
122b0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
122c0 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
122d0 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
122e0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
122f0 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
12300 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
12310 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
12320 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
12330 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
12340 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
12350 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
12360 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
12370 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
12380 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12390 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
123a0 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
123b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
123c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
123d0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
123e0 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
123f0 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
12400 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
12410 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
12420 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
12430 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
12440 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
12450 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12460 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
12470 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
12480 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
12490 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
124a0 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
124b0 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
124c0 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
124d0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
124e0 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
124f0 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
12500 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
12510 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
12520 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
12530 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
12540 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
12550 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69  reate_index;..#i
12560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12570 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
12580 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
12590 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
125a0 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
125b0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
125c0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
125d0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
125e0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
125f0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
12600 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
12610 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
12620 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
12630 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
12640 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
12650 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
12660 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
12670 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
12680 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20       if( pName2 
12690 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  && pName2->n==0 
126a0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
126b0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
126c0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
126d0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
126e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
126f0 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73  endif..    if( s
12700 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
12710 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
12720 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
12730 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c  ) &&.        sql
12740 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
12750 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a  sFix, pTblName).
12760 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
12770 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
12780 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
12790 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
127a0 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
127b0 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
127c0 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
127d0 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
127e0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
127f0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
12800 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
12810 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c  ble(pParse, pTbl
12820 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
12830 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
12840 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
12850 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
12860 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
12870 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12880 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
12890 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d  b[iDb].pSchema==
128a0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
128b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
128c0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
128d0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
128e0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
128f0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
12900 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12910 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
12920 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12930 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
12940 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
12950 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
12960 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61  iDb];..  if( pTa
12970 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
12980 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
12990 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
129a0 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
129b0 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
129c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
129d0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
129e0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
129f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
12a00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12a10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
12a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12a30 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
12a40 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
12a50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12a60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
12a70 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
12a80 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
12a90 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12aa0 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
12ab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ac0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
12ad0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
12ae0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
12af0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12b00 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
12b10 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
12b20 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
12b30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12b40 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
12b50 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
12b60 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
12b70 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
12b80 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
12b90 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
12ba0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
12bb0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
12bc0 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
12bd0 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
12be0 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
12bf0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
12c00 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
12c10 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
12c20 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12c30 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
12c40 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
12c50 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
12c60 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
12c70 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
12c80 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
12c90 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
12ca0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12cb0 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
12cc0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
12cd0 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
12ce0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
12cf0 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
12d00 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
12d10 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
12d20 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
12d30 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
12d40 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
12d50 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
12d60 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
12d70 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
12d80 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
12d90 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
12da0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
12db0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  me);.    if( SQL
12dc0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
12dd0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
12de0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
12df0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12e00 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
12e10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12e20 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53  index;.    if( S
12e30 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
12e40 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
12e50 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
12e60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
12e70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
12e90 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
12ea0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
12eb0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
12ec0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
12ed0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12ee0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12ef0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
12f00 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
12f10 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
12f20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12f30 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
12f40 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
12f50 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
12f60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
12f70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12f80 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
12f90 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
12fa0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
12fb0 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
12fc0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
12fd0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
12fe0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12ff0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13000 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
13010 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
13020 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
13030 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13040 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13050 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
13060 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
13070 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
13080 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
13090 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
130a0 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
130b0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
130c0 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
130d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
130e0 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
130f0 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
13100 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
13110 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
13120 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
13130 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
13140 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
13150 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
13160 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
13170 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
13180 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
13190 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
131a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
131b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
131c0 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
131d0 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
131e0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
131f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13200 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13210 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
13220 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
13230 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
13240 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13250 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
13260 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
13270 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
13280 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13290 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
132a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
132b0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
132c0 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
132d0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
132e0 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
132f0 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
13300 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
13310 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13320 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
13330 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
13340 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13350 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13360 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13370 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
13380 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
13390 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
133a0 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
133b0 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
133c0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
133d0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
133e0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
133f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
13400 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
13410 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
13420 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
13430 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
13440 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
13450 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43 6f  = (u8*)pTab->aCo
13460 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
13470 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
13480 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  d.n = strlen((ch
13490 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  ar*)nullId.z);. 
134a0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
134b0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
134c0 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
134d0 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28  nullId);.    if(
134e0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
134f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13500 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
13510 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
13520 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
13530 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13540 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
13550 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
13560 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
13570 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
13580 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
13590 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
135a0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
135b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
135c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
135d0 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
135e0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
135f0 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
13600 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
13610 20 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d   + strlen(pExpr-
13620 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  >pColl->zName));
13630 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13640 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
13650 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
13660 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
13670 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
13680 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
13690 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
136a0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
136b0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
136c0 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65       sizeof(Inde
136d0 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  x) +            
136e0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
136f0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73  ture  */.      s
13700 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
13710 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
13720 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
13730 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
13740 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  int)*(nCol+1) + 
13750 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
13760 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20  iRowEst   */.   
13770 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a     sizeof(char *
13780 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
13790 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
137a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a      */.      siz
137b0 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
137c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
137d0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
137e0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
137f0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
13800 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
13810 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
13820 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13840 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
13850 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
13860 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
13870 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
13880 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13890 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
138a0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
138b0 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
138c0 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
138d0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
138e0 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
138f0 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
13900 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
13910 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
13920 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
13930 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
13940 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
13950 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
13960 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
13970 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
13980 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
13990 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
139a0 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
139b0 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
139c0 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
139d0 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
139e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
139f0 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
13a00 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
13a10 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
13a20 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
13a30 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
13a40 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
13a50 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
13a60 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
13a70 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
13a80 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
13a90 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
13aa0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
13ab0 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
13ac0 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
13ad0 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
13ae0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
13af0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
13b00 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
13b10 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
13b20 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
13b30 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
13b40 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
13b50 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
13b60 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
13b70 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
13b80 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
13b90 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
13ba0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
13bb0 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
13bc0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
13bd0 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
13be0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
13bf0 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
13c00 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
13c10 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
13c20 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
13c30 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
13c40 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
13c50 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
13c60 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  em++){.    const
13c70 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20   char *zColName 
13c80 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61  = pListItem->zNa
13c90 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  me;.    Column *
13ca0 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  pTabCol;.    int
13cb0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
13cc0 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  der;.    char *z
13cd0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13ce0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
13cf0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
13d00 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a  me */..    for(j
13d10 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  =0, pTabCol=pTab
13d20 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
13d30 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43  nCol; j++, pTabC
13d40 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
13d50 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
13d60 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f  zColName, pTabCo
13d70 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  l->zName)==0 ) b
13d80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13d90 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
13da0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
13db0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13dc0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
13dd0 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
13de0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
13df0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e  ab->zName, zColN
13e00 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
13e10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13e20 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ex;.    }.    /*
13e30 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
13e40 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
13e50 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
13e60 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
13e70 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68  d.    ** more th
13e80 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74  an once within t
13e90 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20  he same index.  
13ea0 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69  Only the first i
13eb0 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a  nstance of.    *
13ec0 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c  * the column wil
13ed0 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62  l ever be used b
13ee0 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
13ef0 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e    Note that usin
13f00 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d  g the.    ** sam
13f10 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68  e column more th
13f20 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62  an once cannot b
13f30 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  e an error becau
13f40 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20  se that would . 
13f50 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b     ** break back
13f60 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
13f70 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74  ity - it needs t
13f80 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a  o be a warning..
13f90 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65      */.    pInde
13fa0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
13fb0 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
13fc0 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a  tItem->pExpr ){.
13fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
13fe0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
13ff0 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a  pColl );.      z
14000 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
14010 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
14020 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a 45  rintf(nExtra, zE
14030 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69 73  xtra, "%s", pLis
14040 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
14050 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
14060 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74     zExtra += (st
14070 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29  rlen(zColl) + 1)
14080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14090 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
140a0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
140b0 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c        if( !zColl
140c0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
140d0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
140e0 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
140f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14100 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
14110 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
14120 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14130 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  zColl, -1) ){.  
14140 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14150 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14160 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
14170 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
14180 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
14190 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
141a0 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
141b0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
141c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
141d0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75  tOrder[i] = requ
141e0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
141f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
14200 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
14210 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
14220 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
14230 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
14240 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
14250 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
14260 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
14270 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
14280 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
14290 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
142a0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
142b0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
142c0 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
142d0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
142e0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
142f0 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
14300 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
14310 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
14320 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
14330 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
14340 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
14350 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
14360 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
14370 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
14380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
14390 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
143a0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
143b0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
143c0 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
143d0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
143e0 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
143f0 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
14400 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
14410 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
14420 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
14430 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
14440 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
14450 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
14460 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
14470 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
14480 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
14490 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
144a0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
144b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
144c0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
144d0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
144e0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
144f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
14500 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
14510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14520 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
14530 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
14540 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
14550 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
14560 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
14570 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
14580 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
14590 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
145a0 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70  nst char *z1 = p
145b0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
145c0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
145d0 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d  ar *z2 = pIndex-
145e0 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
145f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
14600 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
14610 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
14620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14630 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  if( pIdx->aSortO
14640 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  rder[k]!=pIndex-
14650 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29  >aSortOrder[k] )
14660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14670 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71  if( z1!=z2 && sq
14680 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
14690 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
146b0 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
146c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
146d0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
146e0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
146f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
14700 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
14710 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
14720 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
14730 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
14740 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
14750 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
14760 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
14770 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
14780 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
14790 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
147a0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
147b0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
147c0 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
147d0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
147e0 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
147f0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
14800 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
14810 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
14820 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
14830 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
14840 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
14850 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
14860 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
14870 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
14880 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
14890 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
148a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
148b0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
148c0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
148d0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
148e0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
148f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14900 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14910 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
14920 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
14930 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
14940 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
14950 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
14960 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
14970 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
14980 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
14990 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
149a0 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
149b0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
149c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
149d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
149e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
149f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14a00 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
14a10 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
14a20 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
14a30 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
14a40 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
14a50 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
14a60 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
14a70 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
14a80 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
14a90 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
14aa0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
14ab0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
14ac0 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
14af0 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e   strlen(pIndex->
14b00 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
14b10 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
14b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
14b30 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
14b40 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
14b50 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
14b60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14b70 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
14b80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14b90 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
14ba0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
14bb0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
14bc0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
14bd0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
14be0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
14bf0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
14c00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
14c10 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
14c20 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
14c30 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
14c40 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
14c50 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
14c60 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
14c70 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
14c80 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
14c90 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
14ca0 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
14cb0 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
14cc0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
14cd0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
14ce0 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
14cf0 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
14d00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
14d10 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
14d20 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
14d30 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
14d40 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
14d50 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
14d60 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
14d70 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
14d80 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
14d90 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
14da0 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
14db0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
14dc0 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
14dd0 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
14de0 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
14df0 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
14e00 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
14e10 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
14e20 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
14e30 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
14e40 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
14e50 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
14e60 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
14e70 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
14e80 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
14e90 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
14ea0 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
14eb0 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
14ec0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
14ed0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
14ee0 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
14ef0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
14f00 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
14f10 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  y==0 ){.    Vdbe
14f20 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
14f30 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
14f40 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
14f50 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
14f60 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14f70 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
14f80 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
14f90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20  reate_index;... 
14fa0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
14fb0 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
14fc0 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
14fd0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
14fe0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
14ff0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
15000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15010 64 4f 70 31 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp1(v, OP_Creat
15020 65 49 6e 64 65 78 2c 20 69 44 62 29 3b 0a 20 20  eIndex, iDb);.  
15030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15040 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
15050 30 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f  0, iMem);..    /
15060 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
15070 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
15080 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
15090 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
150a0 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
150b0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
150c0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26     if( pStart &&
150d0 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f   pEnd ){.      /
150e0 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
150f0 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
15100 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
15110 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
15120 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
15130 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
15140 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
15150 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
15160 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
15170 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
15180 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
15190 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
151a0 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
151b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
151c0 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
151d0 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
151e0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
151f0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
15200 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
15210 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
15220 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
15230 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
15240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
15250 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
15260 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
15270 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
15280 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
15290 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
152a0 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
152b0 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
152c0 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
152d0 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20  ,%Q,#0,%Q);",.  
152e0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
152f0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
15300 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
15310 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
15320 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
15330 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
15340 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
15350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15360 4f 70 31 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  Op1(v, OP_Pop, 1
15370 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15380 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  ree(zStmt);..   
15390 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
153a0 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
153b0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
153c0 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
153d0 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
153e0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
153f0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
15400 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
15410 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
15420 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15430 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
15440 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
15450 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
15460 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
15470 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
15480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15490 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(v, OP_ParseSc
154a0 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
154b0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
154c0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
154d0 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
154e0 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
154f0 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
15500 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15510 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
15520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15530 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
15540 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
15550 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
15560 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
15570 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
15580 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
15590 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
155a0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
155b0 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
155c0 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
155d0 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
155e0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
155f0 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
15600 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
15610 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
15620 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
15630 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
15640 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
15650 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
15660 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
15670 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
15680 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
15690 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
156a0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
156b0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
156c0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
156d0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
156e0 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
156f0 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
15700 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
15710 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
15720 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
15730 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
15740 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
15750 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
15760 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
15770 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
15780 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
15790 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
157a0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
157b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
157c0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
157d0 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
157e0 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
157f0 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
15800 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
15810 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65   ){.    freeInde
15820 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
15830 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15840 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
15850 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
15860 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b  elete(pTblName);
15870 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15880 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
15890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
158a0 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65  ate code to make
158b0 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 66   sure the file f
158c0 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20  ormat number is 
158d0 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d  at least minForm
158e0 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72  at..** The gener
158f0 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69  ated code will i
15900 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
15910 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
15920 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
15930 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69  void sqlite3Mini
15940 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61  mumFileFormat(Pa
15950 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15960 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72   iDb, int minFor
15970 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  mat){.  Vdbe *v;
15980 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
15990 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
159a0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
159b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
159c0 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
159d0 2c 20 69 44 62 2c 20 30 2c 20 31 29 3b 0a 20 20  , iDb, 0, 1);.  
159e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
159f0 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
15a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15a10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp1(v, OP_Inte
15a20 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 29 3b  ger, minFormat);
15a30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15a40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 65 2c  AddOp2(v, OP_Ge,
15a50 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
15a60 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
15a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15a80 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 6e  eAddOp1(v, OP_In
15a90 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
15aa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
15ac0 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  etCookie, iDb, 1
15ad0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15ae0 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
15af0 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
15b00 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
15b10 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
15b20 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
15b30 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
15b40 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
15b50 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
15b60 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
15b70 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63   is suppose to c
15b80 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
15b90 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
15ba0 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
15bb0 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
15bc0 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
15bd0 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
15be0 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
15bf0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
15c00 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
15c10 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
15c20 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
15c30 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
15c40 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
15c50 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
15c60 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
15c70 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
15c80 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
15c90 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
15ca0 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
15cb0 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  iniation of the 
15cc0 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
15cd0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
15ce0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
15cf0 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
15d00 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
15d10 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
15d20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
15d30 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
15d40 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
15d50 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
15d60 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
15d70 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
15d80 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
15d90 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
15da0 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
15db0 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
15dc0 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
15dd0 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
15de0 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
15df0 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
15e00 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
15e10 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
15e20 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
15e30 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
15e40 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
15e50 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
15e60 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
15e70 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b   assert( a!=0 );
15e80 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30  .  a[0] = 100000
15e90 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d  0;.  for(i=pIdx-
15ea0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20  >nColumn; i>=5; 
15eb0 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i--){.    a[i] =
15ec0 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   5;.  }.  while(
15ed0 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69   i>=1 ){.    a[i
15ee0 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20  ] = 11 - i;.    
15ef0 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  i--;.  }.  if( p
15f00 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
15f10 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70  _None ){.    a[p
15f20 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20  Idx->nColumn] = 
15f30 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
15f40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
15f50 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
15f60 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
15f70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
15f80 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
15f90 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
15fa0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
15fb0 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
15fc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
15fd0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
15fe0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
15ff0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
16000 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
16010 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16020 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
16030 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
16040 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
16050 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
16060 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
16070 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
16080 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
16090 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
160a0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
160b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
160c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
160d0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
160e0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
160f0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
16100 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
16110 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
16120 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
16130 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
16140 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
16150 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16160 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16170 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
16180 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
16190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
161a0 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
161b0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
161c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
161d0 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
161e0 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20  >autoIndex ){.  
161f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16200 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
16210 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16220 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
16230 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
16240 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
16250 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
16260 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16270 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
16280 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
16290 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
162a0 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
162b0 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
162c0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
162d0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
162e0 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
162f0 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
16300 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
16310 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
16320 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
16330 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
16340 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
16350 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
16360 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
16370 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16380 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16390 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
163a0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
163b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
163c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
163d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d     }.    if( !OM
163e0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
163f0 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
16400 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
16410 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16420 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16430 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
16440 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
16450 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
16460 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16470 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
16480 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16490 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
164a0 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
164b0 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
164c0 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
164d0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
164e0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
164f0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
16500 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
16510 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
16520 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
16530 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
16540 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44  Parse,.       "D
16550 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
16560 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
16570 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
16580 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
16590 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
165a0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
165b0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
165c0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
165d0 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
165e0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
165f0 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
16600 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
16610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16620 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
16630 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
16640 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
16650 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
16660 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
16670 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
16680 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
16690 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
166a0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
166b0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
166c0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
166d0 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
166e0 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
166f0 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74  size.  This rout
16700 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
16710 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e  new.** object on
16720 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16730 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  array..**.** *pn
16740 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d  Entry is the num
16750 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61  ber of entries a
16760 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20  lready in use.  
16770 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74  *pnAlloc is.** t
16780 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  he previously al
16790 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
167a0 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74  the array.  init
167b0 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  Size is the.** s
167c0 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
167d0 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f   array size allo
167e0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
167f0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
16800 65 77 20 65 6e 74 72 79 20 69 73 20 72 65 74 75  ew entry is retu
16810 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a  rned in *pIdx..*
16820 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16830 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  e returns a poin
16840 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
16850 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68   of objects.  Th
16860 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74  is.** might be t
16870 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
16880 41 72 72 61 79 20 70 61 72 61 6d 65 74 65 72 20  Array parameter 
16890 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  or it might be a
168a0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f   different.** po
168b0 69 6e 74 65 72 20 69 66 20 74 68 65 20 61 72 72  inter if the arr
168c0 61 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a  ay was resized..
168d0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
168e0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
168f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
16900 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
16910 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
16920 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
16930 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
16940 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
16950 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
16960 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
16970 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
16980 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
16990 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
169a0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
169b0 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20  int initSize,   
169c0 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69    /* Suggested i
169d0 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
169e0 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a  n, in elements *
169f0 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
16a00 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
16a10 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
16a20 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
16a30 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20   int *pnAlloc,  
16a40 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
16a50 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
16a60 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
16a70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  s */.  int *pIdx
16a80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16a90 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
16aa0 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
16ab0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
16ac0 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e    if( *pnEntry >
16ad0 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  = *pnAlloc ){.  
16ae0 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
16af0 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
16b00 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70     newSize = (*p
16b10 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74  nAlloc)*2 + init
16b20 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Size;.    pNew =
16b30 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
16b40 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65  c(db, pArray, ne
16b50 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a  wSize*szEntry);.
16b60 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
16b70 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
16b80 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
16b90 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
16ba0 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e      *pnAlloc = n
16bb0 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 41 72 72  ewSize;.    pArr
16bc0 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
16bd0 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
16be0 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
16bf0 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74  *pnEntry * szEnt
16c00 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
16c10 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45  ;.  *pIdx = *pnE
16c20 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74  ntry;.  ++*pnEnt
16c30 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
16c40 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
16c50 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
16c60 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
16c70 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
16c80 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
16c90 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
16ca0 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
16cb0 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
16cc0 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
16cd0 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
16ce0 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
16cf0 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  ppend(sqlite3 *d
16d00 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
16d10 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
16d20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
16d30 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
16d40 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
16d50 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
16d60 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
16d70 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
16d80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16d90 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
16da0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 0;.  }.  pLi
16db0 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
16dc0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
16dd0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
16de0 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
16df0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
16e00 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20  ),.      5,.    
16e10 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20    &pList->nId,. 
16e20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c       &pList->nAl
16e30 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  loc,.      &i.  
16e40 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
16e50 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
16e60 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
16e70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16e80 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
16e90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
16ea0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
16eb0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
16ec0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
16ed0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
16ee0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
16ef0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
16f00 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
16f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
16f20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
16f30 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
16f40 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
16f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
16f60 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
16f70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
16f80 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d  ite3_free(pList-
16f90 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  >a);.  sqlite3_f
16fa0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
16fb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16fc0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
16fd0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
16fe0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
16ff0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
17000 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
17010 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
17020 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
17030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
17040 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
17050 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17060 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
17070 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
17080 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
17090 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
170a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
170b0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
170c0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
170d0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
170e0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
170f0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
17100 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
17110 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
17120 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
17130 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
17140 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
17150 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
17160 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
17170 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
17180 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
17190 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
171a0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
171b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
171c0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
171d0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
171e0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
171f0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
17200 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
17210 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
17220 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
17230 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
17240 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
17250 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
17260 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
17270 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
17280 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
17290 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
172a0 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
172b0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
172c0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
172d0 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
172e0 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
172f0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
17300 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
17310 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
17320 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
17330 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
17340 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
17350 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
17360 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
17370 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
17380 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
17390 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
173a0 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
173b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
173c0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
173d0 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,0);.**.**
173e0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
173f0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
17400 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
17410 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
17420 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
17430 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
17440 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
17450 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
17460 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
17470 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
17480 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
17490 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
174a0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
174b0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
174c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
174d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
174e0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
174f0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
17500 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
17510 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
17520 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
17530 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
17540 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
17550 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
17560 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
17570 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
17580 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
17590 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
175a0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
175b0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
175c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
175d0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
175e0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
175f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17600 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
17610 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
17620 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17630 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
17640 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
17650 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
17660 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
17670 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
17680 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
17690 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
176a0 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
176b0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
176c0 62 2c 20 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  b, pList,.      
176d0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
176e0 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
176f0 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
17700 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
17710 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
17720 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17730 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
17740 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
17750 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
17760 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
17770 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
17780 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
17790 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
177a0 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
177b0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
177c0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
177d0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
177e0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
177f0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
17800 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
17810 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
17820 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
17830 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
17840 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
17850 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
17860 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
17870 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
17880 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
17890 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
178a0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
178b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
178c0 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
178d0 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
178e0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 49  ursor = -1;.  pI
178f0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
17900 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e   = 0;.  pList->n
17910 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Src++;.  return 
17920 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
17930 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74  Assign cursors t
17940 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
17950 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
17960 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
17970 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
17980 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
17990 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
179a0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
179b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
179c0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
179d0 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
179e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
179f0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
17a00 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
17a10 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
17a20 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
17a30 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
17a40 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
17a50 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
17a60 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
17a70 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17a80 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
17a90 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
17aa0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17ab0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
17ac0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
17ad0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
17ae0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
17af0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17b00 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
17b10 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
17b20 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
17b30 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
17b40 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
17b50 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
17b60 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
17b70 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
17b80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17b90 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17ba0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17bb0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
17bc0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
17bd0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
17be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
17bf0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ree(pItem->zData
17c00 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
17c10 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a  e3_free(pItem->z
17c20 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
17c30 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a  e3_free(pItem->z
17c40 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69  Alias);.    sqli
17c50 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
17c60 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
17c70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
17c80 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c  lete(pItem->pSel
17c90 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
17ca0 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
17cb0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
17cc0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
17cd0 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  (pItem->pUsing);
17ce0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
17cf0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
17d00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17d10 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
17d20 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
17d30 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
17d40 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
17d50 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
17d60 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
17d70 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
17d80 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
17d90 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
17da0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
17db0 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
17dc0 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
17dd0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
17de0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
17df0 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
17e00 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
17e10 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
17e20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
17e30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
17e40 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
17e50 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
17e60 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
17e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
17e80 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
17e90 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
17ea0 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
17eb0 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
17ec0 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
17ed0 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
17ee0 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
17ef0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
17f00 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
17f10 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
17f20 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
17f30 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
17f40 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
17f50 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
17f60 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
17f70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
17f80 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
17f90 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
17fa0 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
17fb0 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
17fc0 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
17fd0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
17fe0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
17ff0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
18000 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
18010 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
18020 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
18030 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
18040 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
18050 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
18060 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18070 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18080 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
18090 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
180a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
180b0 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
180c0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
180d0 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
180e0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
180f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18100 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
18110 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
18120 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
18130 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
18140 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18150 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
18160 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
18170 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
18180 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
18190 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
181a0 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
181b0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
181c0 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
181d0 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
181e0 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
181f0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
18200 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18220 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
18230 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
18240 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
18250 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
18260 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
18270 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
18280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18290 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
182a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
182b0 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  b;.  p = sqlite3
182c0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
182d0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
182e0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
182f0 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d  ==0 || p->nSrc==
18300 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
18310 45 78 70 72 44 65 6c 65 74 65 28 70 4f 6e 29 3b  ExprDelete(pOn);
18320 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
18330 73 74 44 65 6c 65 74 65 28 70 55 73 69 6e 67 29  stDelete(pUsing)
18340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
18350 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 71 75  ectDelete(pSubqu
18360 65 72 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ery);.    return
18370 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   p;.  }.  pItem 
18380 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
18390 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73  1];.  if( pAlias
183a0 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b   && pAlias->n ){
183b0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
183c0 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
183d0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
183e0 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
183f0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
18400 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
18410 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
18420 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
18430 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
18440 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  p;.}../*.** When
18450 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
18460 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
18470 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
18480 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
18490 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
184a0 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
184b0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
184c0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
184d0 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
184e0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
184f0 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
18500 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
18510 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
18520 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
18530 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
18540 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
18550 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
18560 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
18570 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
18580 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
18590 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
185a0 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
185b0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
185c0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
185d0 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
185e0 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
185f0 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
18600 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
18610 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
18620 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
18630 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
18640 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
18650 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
18660 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
18670 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
18680 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
18690 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
186a0 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
186b0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
186c0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26   *p){.  if( p &&
186d0 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74   p->a ){.    int
186e0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
186f0 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
18700 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
18710 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  ].jointype = p->
18720 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b  a[i-1].jointype;
18730 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
18740 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  0].jointype = 0;
18750 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  .  }.}../*.** Be
18760 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
18770 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
18780 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
18790 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
187a0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
187b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
187c0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
187d0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
187e0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
187f0 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
18800 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
18810 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
18820 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
18830 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
18840 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
18850 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
18860 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
18870 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
18880 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
18890 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
188a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
188b0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
188c0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
188d0 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
188e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
188f0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
18900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18910 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
18920 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
18930 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
18940 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18950 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
18960 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
18970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18980 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
18990 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
189a0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
189b0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
189c0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
189d0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
189e0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
189f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
18a00 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
18a10 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
18a20 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
18a30 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
18a40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
18a50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
18a60 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
18a70 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
18a80 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
18a90 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
18aa0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
18ab0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
18ac0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
18ad0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18ae0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
18af0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18b00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18b10 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
18b20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
18b30 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
18b40 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
18b50 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
18b60 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
18b70 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
18b80 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
18b90 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
18ba0 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
18bb0 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
18bc0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
18bd0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18be0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
18bf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18c00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
18c10 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
18c20 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
18c30 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
18c40 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
18c50 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
18c60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18c70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
18c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18c90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18ca0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
18cb0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
18cc0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
18cd0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
18ce0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
18cf0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
18d00 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
18d10 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
18d20 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
18d30 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
18d40 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
18d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
18d60 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
18d70 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
18d80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
18d90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
18da0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
18db0 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
18dc0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
18dd0 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20   rc;.    static 
18de0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
18df0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
18e00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
18e10 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
18e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18e30 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
18e40 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
18e50 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
18e60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
18e70 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
18e80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18e90 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
18ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18eb0 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20  eFactory(db, 0, 
18ec0 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  0, SQLITE_DEFAUL
18ed0 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66 6c  T_CACHE_SIZE, fl
18ee0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 31        &db->aDb[1
18f10 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
18f20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
18f40 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18f50 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
18f60 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
18f70 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
18f80 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
18f90 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18fa0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
18fb0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
18fc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
18fd0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
18fe0 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f  gs & !db->autoCo
18ff0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  mmit ){.      rc
19000 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
19010 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44  eginTrans(db->aD
19020 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20  b[1].pBt, 1);.  
19030 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19050 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19060 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
19070 20 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20   to get a write 
19080 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20  lock on ".      
19090 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61      "the tempora
190a0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
190b0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ");.        pPar
190c0 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
190d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
190e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
190f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
19100 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
19110 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19120 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
19130 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
19140 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
19150 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
19160 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
19170 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
19180 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
19190 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
191a0 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
191b0 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
191c0 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
191d0 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
191e0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
191f0 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
19200 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
19210 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
19220 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
19230 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
19240 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
19250 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
19260 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
19270 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
19280 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
19290 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
192a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
192b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
192c0 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
192d0 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
192e0 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
192f0 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
19300 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
19310 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
19320 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
19330 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
19340 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
19350 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
19360 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
19370 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
19380 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
19390 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
193a0 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
193b0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
193c0 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
193d0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
193e0 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
193f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
19400 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
19410 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
19420 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
19430 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
19440 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
19450 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
19460 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
19470 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
19480 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
19490 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
194a0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
194b0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
194c0 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
194d0 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
194e0 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
194f0 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
19500 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
19510 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
19520 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
19530 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
19540 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
19550 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
19560 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
19570 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
19580 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
19590 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
195a0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
195b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
195c0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
195d0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
195e0 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
195f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19600 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
19610 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
19620 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
19630 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
19640 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
19650 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
19660 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
19670 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
19680 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
19690 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
196a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
196b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
196c0 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
196d0 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
196e0 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
196f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19700 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
19710 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
19720 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
19730 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
19740 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61  CHED+2 );.    ma
19750 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20  sk = 1<<iDb;.   
19760 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63 6f   if( (pParse->co
19770 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  okieMask & mask)
19780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
19790 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
197a0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
197b0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
197c0 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
197d0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
197e0 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
197f0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
19800 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
19810 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19820 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
19830 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
19840 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
19850 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
19860 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
19870 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
19880 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
19890 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
198a0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
198b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
198c0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
198d0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
198e0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
198f0 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
19900 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
19910 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
19920 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
19930 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
19940 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
19950 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
19960 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
19970 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
19980 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
19990 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
199a0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
199b0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
199c0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
199d0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
199e0 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
199f0 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
19a00 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
19a10 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
19a20 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
19a30 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
19a40 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
19a50 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
19a60 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
19a70 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
19a80 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
19a90 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
19aa0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
19ab0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
19ac0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
19ad0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
19ae0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
19af0 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f   be set..**.** O
19b00 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62  nly database iDb
19b10 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
19b20 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
19b30 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73  writable by this
19b40 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62   call..** If iDb
19b50 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ==0, then the ma
19b60 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61  in and temp data
19b70 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77  bases are made w
19b80 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a  ritable.   If.**
19b90 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c   iDb==1 then onl
19ba0 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  y the temp datab
19bb0 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  ase is made writ
19bc0 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20  able.  If iDb>1 
19bd0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63  then the.** spec
19be0 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20  ified auxiliary 
19bf0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
19c00 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
19c10 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
19c20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19c30 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
19c40 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
19c50 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
19c60 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
19c70 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
19c80 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
19c90 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
19ca0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
19cb0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
19cc0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
19cd0 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
19ce0 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
19cf0 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
19d00 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  nt && pParse->ne
19d10 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
19d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19d30 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  (v, OP_Statement
19d40 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , iDb);.  }.  if
19d50 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c  ( (OMIT_TEMPDB |
19d60 7c 20 69 44 62 21 3d 31 29 20 26 26 20 70 50 61  | iDb!=1) && pPa
19d70 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e  rse->db->aDb[1].
19d80 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  pBt!=0 ){.    sq
19d90 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
19da0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
19db0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31   setStatement, 1
19dc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19dd0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19de0 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
19df0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
19e00 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
19e10 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
19e20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
19e30 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
19e40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19e50 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
19e60 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
19e70 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
19e80 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
19e90 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
19ea0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
19eb0 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
19ec0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
19ed0 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
19ee0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
19ef0 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20     if( z==zColl 
19f00 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26  || (z && zColl &
19f10 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
19f20 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29  Cmp(z, zColl)) )
19f30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
19f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19f50 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
19f60 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
19f70 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
19f80 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
19f90 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
19fa0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
19fb0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
19fc0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
19fd0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
19fe0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19ff0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
1a000 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
1a010 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
1a020 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
1a030 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
1a040 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  zColl){.  Index 
1a050 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
1a060 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
1a070 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1a080 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
1a090 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
1a0a0 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
1a0b0 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
1a0c0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f  xt){.    if( zCo
1a0d0 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
1a0e0 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
1a0f0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
1a100 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
1a110 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
1a120 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
1a130 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
1a140 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1a150 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1a160 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1a170 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a180 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a190 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
1a1a0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
1a1b0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1a1c0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
1a1d0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
1a1e0 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
1a1f0 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
1a200 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
1a210 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1a220 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
1a230 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
1a240 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
1a250 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
1a260 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1a270 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
1a280 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
1a290 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
1a2a0 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
1a2b0 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
1a2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a2d0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1a2e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a2f0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1a300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a310 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
1a320 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
1a330 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1a340 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
1a350 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a360 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
1a370 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
1a380 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1a390 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
1a3a0 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
1a3b0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1a3c0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1a3d0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1a3e0 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62  se */..  for(iDb
1a3f0 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
1a400 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1a410 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
1a420 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
1a430 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
1a440 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
1a450 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
1a460 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
1a470 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
1a480 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
1a490 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
1a4a0 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
1a4b0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1a4c0 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
1a4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1a4e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
1a4f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1a500 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
1a510 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
1a520 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
1a550 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
1a560 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
1a570 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
1a580 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1a590 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
1a5a0 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
1a5b0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
1a5c0 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
1a5d0 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
1a5e0 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
1a5f0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
1a600 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
1a610 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
1a620 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
1a630 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
1a640 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
1a650 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
1a660 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
1a670 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
1a680 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
1a690 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
1a6a0 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
1a6b0 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
1a6c0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
1a6d0 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
1a6e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a6f0 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
1a700 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
1a710 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1a720 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
1a730 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
1a740 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1a750 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
1a760 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
1a770 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
1a780 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
1a790 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
1a7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1a7b0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
1a7c0 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
1a7d0 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
1a7e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1a800 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a820 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
1a830 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
1a840 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1a850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1a860 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1a870 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
1a880 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8a0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
1a8b0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
1a8c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1a8d0 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
1a8e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1a8f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
1a900 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
1a910 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1a920 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1a930 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
1a940 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
1a950 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1a960 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
1a970 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
1a980 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
1a990 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
1a9a0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
1a9b0 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
1a9c0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1a9d0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1a9e0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1a9f0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
1aa00 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c  if( pName1==0 ||
1aa10 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b   pName1->z==0 ){
1aa20 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
1aa30 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
1aa40 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1aa50 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 32  }else if( pName2
1aa60 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  ==0 || pName2->z
1aa70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
1aa80 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
1aa90 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1aaa0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
1aab0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1aac0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1aad0 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
1aae0 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
1aaf0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1ab00 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1ab10 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
1ab20 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 69  l, -1, 0);.    i
1ab30 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1ab40 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20    if( zColl ){. 
1ab50 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61         reindexDa
1ab60 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
1ab70 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zColl);.        
1ab80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1ab90 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
1aba0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1abb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1abc0 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  e(zColl);.  }.  
1abd0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
1abe0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
1abf0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
1ac00 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69   &pObjName);.  i
1ac10 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
1ac20 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
1ac30 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1ac40 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69  , pObjName);.  i
1ac50 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
1ac60 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  zDb = db->aD
1ac70 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
1ac80 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
1ac90 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
1aca0 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
1acb0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
1acc0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1acd0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1ace0 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  3_free(z);.    r
1acf0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
1ad00 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1ad10 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
1ad20 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b);.  sqlite3_fr
1ad30 65 65 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  ee(z);.  if( pIn
1ad40 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
1ad50 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1ad60 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1ad70 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1ad80 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
1ad90 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
1ada0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1adb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
1adc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1add0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
1ade0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
1adf0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
1ae00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1ae10 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c  eturn a dynamicl
1ae20 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49  y allocated KeyI
1ae30 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
1ae40 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  at can be used.*
1ae50 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65  * with OP_OpenRe
1ae60 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69  ad or OP_OpenWri
1ae70 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  te to access dat
1ae80 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78  abase index pIdx
1ae90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1aea0 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72  ssful, a pointer
1aeb0 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75   to the new stru
1aec0 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65  cture is returne
1aed0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  d. In this case.
1aee0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1aef0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1af00 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
1af10 5f 66 72 65 65 28 29 20 6f 6e 20 74 68 65 20 72  _free() on the r
1af20 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1af30 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1af40 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1af50 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1af60 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1af70 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1af80 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1af90 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1afa0 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1afb0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1afc0 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1afd0 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1afe0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1aff0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1b000 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1b010 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1b020 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1b030 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1b040 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1b050 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1b060 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49  ) + nCol;.  KeyI
1b070 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
1b080 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62  Info *)sqlite3Db
1b090 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
1b0a0 65 2d 3e 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a  e->db, nBytes);.
1b0b0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1b0c0 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50     pKey->db = pP
1b0d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b  arse->db;.    pK
1b0e0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ey->aSortOrder =
1b0f0 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61   (u8 *)&(pKey->a
1b100 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20  Coll[nCol]);.   
1b110 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e   assert( &pKey->
1b120 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
1b130 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29  ==&(((u8 *)pKey)
1b140 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20  [nBytes]) );.   
1b150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1b160 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
1b170 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
1b180 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1b190 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c     assert( zColl
1b1a0 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e   );.      pKey->
1b1b0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
1b1c0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
1b1d0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
1b1e0 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  1);.      pKey->
1b1f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1b200 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1b210 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1b220 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43  Key->nField = nC
1b230 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ol;.  }..  if( p
1b240 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1b250 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b260 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1b270 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1b280 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.