/ Hex Artifact Content
Login

Artifact 60a3ec74b45634654e06a72224ac01bd33ac69f1:


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 39 20 32 30 30 38 2f 30 31 2f 30 35  1.459 2008/01/05
02f0: 20 30 35 3a 32 30 3a 31 30 20 64 72 68 20 45 78   05:20:10 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 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
11950 6d 6d 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73  mm, 0, 1);.    s
11960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11970 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c  (v, OP_IsUnique,
11980 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a 20   iIdx, addr2);. 
11990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
119a0 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
119b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
119c0 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c  NT, OE_Abort, 0,
119d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119e0 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f       "indexed co
119f0 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
11a00 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43  ique", P4_STATIC
11a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
11a20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11a30 7c 7c 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65  || addr2==sqlite
11a40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11a50 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (v) );.  }.  sql
11a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11a70 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
11a80 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iIdx, 0);.  sqli
11a90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11aa0 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
11ab0 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69  addr1+1);.  sqli
11ac0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11ad0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c  v, addr1);.  sql
11ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11af0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62  , OP_Close, iTab
11b00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11b10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
11b20 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a  se, iIdx);.}../*
11b30 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
11b40 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
11b50 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
11b60 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
11b70 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
11b80 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
11b90 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
11ba0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
11bb0 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
11bc0 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
11bd0 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
11be0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
11bf0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
11c00 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
11c10 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
11c20 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
11c30 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
11c40 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
11c50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
11c60 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
11c70 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11c80 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11c90 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
11ca0 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
11cb0 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
11cc0 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
11cd0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
11ce0 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
11cf0 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
11d00 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
11d10 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
11d20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
11d30 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
11d40 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
11d50 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
11d60 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
11d70 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
11d80 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
11d90 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
11da0 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
11db0 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
11dc0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11dd0 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
11de0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11df0 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
11e00 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
11e10 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
11e20 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
11e30 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
11e40 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
11e50 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
11e60 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
11e70 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
11e80 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
11e90 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
11ea0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
11eb0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
11ec0 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
11ed0 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
11ee0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
11ef0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
11f00 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
11f10 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
11f20 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
11f30 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
11f40 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
11f50 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
11f60 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
11f70 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
11f80 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
11f90 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
11fa0 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20       /* The ")" 
11fb0 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20  that closes the 
11fc0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
11fd0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
11fe0 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
11ff0 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
12000 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
12010 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
12020 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
12030 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
12040 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
12050 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
12060 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
12070 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
12080 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
12090 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
120a0 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
120b0 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
120c0 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
120d0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
120e0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
120f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
12100 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
12110 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
12120 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
12130 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
12140 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
12150 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
12160 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
12170 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
12180 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
12190 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
121a0 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
121b0 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
121c0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
121d0 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
121e0 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
121f0 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
12200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12210 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12220 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
12230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
12240 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
12250 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
12260 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
12270 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
12280 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12290 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
122a0 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
122b0 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
122c0 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
122d0 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
122e0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
122f0 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
12300 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
12310 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
12320 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
12330 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
12340 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt nCol;.  int n
12350 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61  Extra = 0;.  cha
12360 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66  r *zExtra;..  if
12370 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
12380 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12390 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  ed || IN_DECLARE
123a0 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74  _VTAB ){.    got
123b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
123c0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
123d0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
123e0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
123f0 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
12400 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
12410 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
12420 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
12430 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
12440 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
12450 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
12460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
12470 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
12480 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
12490 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
124a0 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
124b0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
124c0 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
124d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
124e0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
124f0 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
12500 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
12510 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
12520 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
12530 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
12540 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
12550 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12570 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
12580 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
12590 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
125a0 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
125b0 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  he the table.   
125c0 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
125d0 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
125e0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
125f0 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
12600 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
12610 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
12620 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
12630 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
12640 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
12650 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
12660 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
12670 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
12680 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
12690 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  e2 && pName2->n=
126a0 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
126b0 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
126c0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
126d0 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  ){.        iDb =
126e0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
126f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
12700 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
12710 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
12720 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
12730 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20  ame) &&.        
12740 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
12750 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
12760 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
12770 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
12780 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
12790 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
127a0 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
127b0 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
127c0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
127d0 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
127e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
127f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
12800 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
12810 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
12820 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
12830 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
12840 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
12850 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
12860 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
12870 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12880 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12890 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
128a0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
128b0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
128c0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
128d0 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
128e0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
128f0 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
12900 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
12910 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
12920 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12930 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12940 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12950 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
12960 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20  Db[iDb];..  if( 
12970 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
12980 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
12990 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
129a0 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
129b0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
129c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
129d0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
129e0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
129f0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
12a00 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
12a10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12a20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12a30 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
12a40 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
12a50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12a60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12a70 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
12a80 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
12a90 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12aa0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
12ab0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
12ac0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12ad0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
12ae0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
12af0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12b00 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
12b10 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
12b20 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
12b30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12b40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
12b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
12b60 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
12b70 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
12b80 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
12b90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
12ba0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
12bb0 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
12bc0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
12bd0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
12be0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
12bf0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
12c00 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
12c10 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
12c20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
12c30 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
12c40 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
12c50 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
12c60 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
12c70 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
12c80 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
12c90 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
12ca0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
12cb0 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
12cc0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
12cd0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
12ce0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
12cf0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
12d00 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
12d10 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
12d20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
12d30 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
12d40 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
12d50 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
12d60 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
12d70 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
12d80 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
12d90 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
12da0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
12db0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
12dc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
12dd0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
12de0 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
12df0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12e00 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
12e10 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12e20 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
12e30 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
12e40 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
12e50 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
12e60 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
12e70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12e80 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
12e90 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
12ea0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
12eb0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
12ec0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
12ed0 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
12ee0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12ef0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
12f00 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
12f10 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
12f20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12f30 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
12f40 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
12f50 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
12f60 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
12f70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12f80 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
12f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
12fa0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
12fb0 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
12fc0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
12fd0 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
12fe0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
12ff0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13000 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
13010 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
13020 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
13030 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13040 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13050 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13060 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
13070 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
13080 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
13090 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
130a0 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
130b0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
130c0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
130d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
130e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
130f0 66 29 2c 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29  f),zBuf,"_%d",n)
13100 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
13110 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
13120 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73  tring(&zName, "s
13130 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
13140 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
13150 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
13160 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
13170 30 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  0 ){.      db->m
13180 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
13190 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
131a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
131b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
131c0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
131d0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
131e0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
131f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13200 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
13210 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
13220 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
13230 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
13240 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
13250 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
13260 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
13270 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
13280 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
13290 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
132a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
132b0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
132c0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
132d0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
132e0 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
132f0 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
13300 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
13310 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
13320 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
13330 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
13340 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
13350 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13360 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
13370 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
13380 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
13390 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
133a0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
133b0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
133c0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
133d0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
133e0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
133f0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13400 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
13410 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
13420 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
13430 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
13440 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
13450 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e  .z = (u8*)pTab->
13460 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
13470 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
13480 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
13490 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29  (char*)nullId.z)
134a0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
134b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
134c0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
134d0 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20  , &nullId);.    
134e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
134f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13500 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74  index;.    pList
13510 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
13520 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   = sortOrder;.  
13530 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
13540 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
13550 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
13560 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
13570 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
13580 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
13590 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
135a0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
135b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
135c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
135d0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
135e0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
135f0 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b      if( pExpr ){
13600 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
13610 20 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45 78   (1 + strlen(pEx
13620 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pr->pColl->zName
13630 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
13640 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
13650 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
13660 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
13670 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
13680 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20  Name);.  nCol = 
13690 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
136a0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
136b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
136c0 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49   .      sizeof(I
136d0 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20 20 20  ndex) +         
136e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
136f0 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20  ructure  */.    
13700 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43    sizeof(int)*nC
13710 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ol +           /
13720 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
13730 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
13740 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29  of(int)*(nCol+1)
13750 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65   +       /* Inde
13760 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a  x.aiRowEst   */.
13770 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61        sizeof(cha
13780 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  r *)*nCol +     
13790 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
137a0 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
137b0 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20  sizeof(u8)*nCol 
137c0 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
137d0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
137e0 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20   */.      nName 
137f0 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
13800 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
13810 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20  zName      */.  
13820 20 20 20 20 6e 45 78 74 72 61 20 20 20 20 20 20      nExtra      
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
13850 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a  quence names */.
13860 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
13870 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13880 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13890 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
138a0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20   pIndex->azColl 
138b0 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64  = (char**)(&pInd
138c0 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ex[1]);.  pIndex
138d0 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
138e0 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a  t *)(&pIndex->az
138f0 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  Coll[nCol]);.  p
13900 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
13910 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26  = (unsigned *)(&
13920 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
13930 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
13940 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
13950 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  (u8 *)(&pIndex->
13960 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d  aiRowEst[nCol+1]
13970 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
13980 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  me = (char *)(&p
13990 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
139a0 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74  r[nCol]);.  zExt
139b0 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  ra = (char *)(&p
139c0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  Index->zName[nNa
139d0 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  me+1]);.  memcpy
139e0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
139f0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
13a00 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
13a10 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
13a20 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
13a30 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
13a40 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
13a50 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
13a60 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
13a70 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
13a80 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
13a90 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
13aa0 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  a;..  /* Check t
13ab0 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
13ac0 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
13ad0 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
13ae0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
13af0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
13b00 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
13b10 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
13b20 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
13b30 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
13b40 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
13b50 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
13b60 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
13b70 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
13b80 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
13b90 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
13ba0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
13bb0 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
13bc0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
13bd0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
13be0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
13bf0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
13c00 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
13c10 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
13c20 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
13c30 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69  0, pListItem=pLi
13c40 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
13c50 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73  nExpr; i++, pLis
13c60 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f  tItem++){.    co
13c70 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61  nst char *zColNa
13c80 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  me = pListItem->
13c90 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d  zName;.    Colum
13ca0 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20  n *pTabCol;.    
13cb0 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
13cc0 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72  tOrder;.    char
13cd0 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
13ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13cf0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13d00 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f   name */..    fo
13d10 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
13d20 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
13d30 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
13d40 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
13d50 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
13d60 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
13d70 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
13d80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13d90 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
13da0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
13db0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13dc0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
13dd0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
13de0 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
13df0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
13e00 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  olName);.      g
13e10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13e20 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
13e30 20 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   /* TODO:  Add a
13e40 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
13e50 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
13e60 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
13e70 61 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65  amed.    ** more
13e80 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69   than once withi
13e90 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  n the same index
13ea0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
13eb0 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20  t instance of.  
13ec0 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20    ** the column 
13ed0 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65  will ever be use
13ee0 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
13ef0 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75  er.  Note that u
13f00 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
13f10 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65  same column more
13f20 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f   than once canno
13f30 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65  t be an error be
13f40 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
13f50 20 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62   .    ** break b
13f60 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
13f70 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64  bility - it need
13f80 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e  s to be a warnin
13f90 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  g..    */.    pI
13fa0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
13fb0 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
13fc0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20  ListItem->pExpr 
13fd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13fe0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
13ff0 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  r->pColl );.    
14000 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
14010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14020 73 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c  snprintf(nExtra,
14030 20 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70   zExtra, "%s", p
14040 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
14050 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  >pColl->zName);.
14060 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
14070 28 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b  (strlen(zColl) +
14080 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
14090 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
140a0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
140b0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
140c0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  oll ){.        z
140d0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
140e0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
140f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14100 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
14110 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
14120 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
14130 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b  e, zColl, -1) ){
14140 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14150 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14160 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
14170 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
14180 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
14190 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
141a0 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
141b0 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
141c0 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
141d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72  SortOrder[i] = r
141e0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
141f0 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
14200 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
14210 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
14220 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
14230 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
14240 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
14250 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
14260 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
14270 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
14280 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
14290 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
142a0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
142b0 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
142c0 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
142d0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
142e0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
142f0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
14300 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
14310 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
14320 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
14330 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
14340 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
14350 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
14360 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
14370 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
14380 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
14390 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
143a0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
143b0 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
143c0 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
143d0 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
143e0 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
143f0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
14400 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
14410 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
14420 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
14430 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
14440 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
14450 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
14460 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
14470 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
14480 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
14490 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
144a0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
144b0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
144c0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
144d0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
144e0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
144f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14500 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
14510 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14520 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
14530 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
14540 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
14550 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
14560 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
14570 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
14580 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
14590 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
145a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20   const char *z1 
145b0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
145c0 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
145d0 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64   char *z2 = pInd
145e0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
145f0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14600 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
14610 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
14620 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
14630 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f     if( pIdx->aSo
14640 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64  rtOrder[k]!=pInd
14650 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b  ex->aSortOrder[k
14660 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
14670 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26     if( z1!=z2 &&
14680 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
14690 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
146a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
146b0 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( k==pIdx->nCol
146c0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
146d0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
146e0 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
146f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
14700 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
14710 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
14720 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
14730 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
14740 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
14750 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
14760 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
14770 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
14780 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
14790 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
147a0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
147b0 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
147c0 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
147d0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
147e0 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
147f0 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
14800 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
14810 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
14820 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
14830 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
14840 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
14850 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
14860 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
14870 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
14880 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74   behaviour for t
14890 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
148a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
148b0 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
148c0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
148d0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
148e0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
148f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14900 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14910 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
14920 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
14930 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
14940 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
14950 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
14960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14970 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
14980 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
14990 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
149a0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
149b0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
149c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
149d0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
149e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
149f0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
14a00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
14a10 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
14a20 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
14a30 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
14a40 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
14a50 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
14a60 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
14a70 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
14a80 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
14a90 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
14aa0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
14ab0 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
14ac0 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
14af0 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65  me, strlen(pInde
14b00 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e  x->zName)+1, pIn
14b10 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
14b20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14b30 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
14b40 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
14b50 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
14b60 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
14b70 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
14b80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14b90 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
14ba0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
14bb0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
14bc0 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
14bd0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
14be0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
14bf0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
14c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14c10 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
14c20 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
14c30 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
14c40 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
14c50 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
14c60 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
14c70 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
14c80 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
14c90 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
14ca0 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
14cb0 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
14cc0 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
14cd0 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
14ce0 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
14cf0 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
14d00 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
14d10 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
14d20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
14d30 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
14d40 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
14d50 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
14d60 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
14d70 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
14d80 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
14d90 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
14da0 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
14db0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
14dc0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
14dd0 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
14de0 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
14df0 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
14e00 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
14e10 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
14e20 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
14e30 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
14e40 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
14e50 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
14e60 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
14e70 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
14e80 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
14e90 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
14ea0 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
14eb0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
14ec0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
14ed0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
14ee0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
14ef0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
14f00 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
14f10 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
14f20 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
14f30 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
14f40 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
14f50 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
14f60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14f70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
14f80 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
14f90 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14fa0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
14fb0 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
14fc0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
14fd0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
14fe0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
14ff0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
15000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15010 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 72  eAddOp1(v, OP_Cr
15020 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 29 3b  eateIndex, iDb);
15030 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
15050 79 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20  y, 0, iMem);..  
15060 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
15070 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
15080 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
15090 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
150a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
150b0 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
150c0 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
150d0 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
150e0 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
150f0 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
15100 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
15110 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
15120 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
15130 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
15140 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
15150 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
15160 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
15170 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
15180 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a  .        pEnd->z
15190 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c   - pName->z + 1,
151a0 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
151b0 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
151c0 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
151d0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
151e0 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
151f0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
15200 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
15210 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
15220 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
15230 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
15240 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
15250 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
15260 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
15270 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
15280 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15290 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
152a0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
152b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
152c0 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
152d0 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c  ,%Q,%Q,#0,%Q);",
152e0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
152f0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
15300 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
15310 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
15320 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
15330 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
15340 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
15350 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15360 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 50 6f 70  AddOp1(v, OP_Pop
15370 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
15380 33 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a  3_free(zStmt);..
15390 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
153a0 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
153b0 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
153c0 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
153d0 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
153e0 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
153f0 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
15400 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
15410 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
15420 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
15430 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
15440 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
15450 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
15460 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
15470 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
15480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15490 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
154a0 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
154b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c   0,.         sql
154c0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
154d0 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
154e0 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f  dex->zName), P4_
154f0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
15500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15510 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
15520 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
15530 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
15540 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
15550 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
15560 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
15570 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
15580 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
15590 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
155a0 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
155b0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
155c0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
155d0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
155e0 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
155f0 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20  tion of UPDATE. 
15600 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a   ** and INSERT..
15610 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
15620 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
15630 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
15640 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
15650 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
15660 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
15670 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
15680 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
15690 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
156a0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
156b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
156c0 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
156d0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
156e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
156f0 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
15700 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
15710 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
15720 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
15730 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
15740 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
15750 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
15760 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
15770 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
15780 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
15790 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
157a0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
157b0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
157c0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
157d0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
157e0 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
157f0 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
15800 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
15810 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49  dex ){.    freeI
15820 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
15830 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  }.  sqlite3ExprL
15840 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
15850 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
15860 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d  stDelete(pTblNam
15870 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
15880 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  ee(zName);.  ret
15890 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  urn;.}../*.** Ge
158a0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d  nerate code to m
158b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69 6c  ake sure the fil
158c0 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
158d0 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  is at least minF
158e0 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65  ormat..** The ge
158f0 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c  nerated code wil
15900 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66  l increase the f
15910 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65  ile format numbe
15920 72 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  r if necessary..
15930 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
15940 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74  inimumFileFormat
15950 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15960 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e  int iDb, int min
15970 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20  Format){.  Vdbe 
15980 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  *v;.  v = sqlite
15990 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
159a0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
159b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159c0 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
159d0 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 31 29 3b  kie, iDb, 0, 1);
159e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
159f0 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
15a00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15a10 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
15a20 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61  nteger, minForma
15a30 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
15a40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15a50 47 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  Ge, 0, sqlite3Vd
15a60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15a70 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +3);.    sqlite3
15a80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15a90 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
15aa0 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
15ab0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ac0 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
15ad0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
15ae0 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
15af0 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
15b00 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
15b10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
15b20 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
15b30 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
15b40 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
15b50 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
15b60 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
15b70 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
15b80 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
15b90 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
15ba0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
15bb0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
15bc0 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
15bd0 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
15be0 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
15bf0 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
15c00 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
15c10 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
15c20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
15c30 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
15c40 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
15c50 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
15c60 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
15c70 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
15c80 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
15c90 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
15ca0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
15cb0 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
15cc0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
15cd0 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
15ce0 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
15cf0 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
15d00 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
15d10 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
15d20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
15d30 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
15d40 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
15d50 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
15d60 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
15d70 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
15d80 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
15d90 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
15da0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
15db0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
15dc0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
15dd0 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
15de0 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
15df0 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
15e00 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
15e10 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
15e20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
15e30 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
15e40 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
15e50 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
15e60 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
15e70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
15e80 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
15e90 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
15ea0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
15eb0 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  5; i--){.    a[i
15ec0 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69  ] = 5;.  }.  whi
15ed0 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20  le( i>=1 ){.    
15ee0 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20  a[i] = 11 - i;. 
15ef0 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66     i--;.  }.  if
15f00 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
15f10 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
15f20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
15f30 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
15f40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15f50 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
15f60 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
15f70 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
15f80 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
15f90 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
15fa0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
15fb0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
15fc0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
15fd0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
15fe0 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
15ff0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
16000 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
16010 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16020 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
16030 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
16040 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
16050 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
16060 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16070 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
16080 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
16090 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
160a0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
160b0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
160c0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
160d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
160e0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
160f0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
16100 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
16110 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
16120 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
16130 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
16140 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
16150 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
16160 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16170 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
16180 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
16190 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
161a0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
161b0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
161c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
161d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
161e0 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
161f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16200 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
16210 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
16220 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
16230 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
16240 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
16250 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
16260 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
16270 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
16280 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
16290 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
162a0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
162b0 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
162c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
162d0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
162e0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
162f0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
16300 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
16310 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
16320 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16330 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
16340 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
16350 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
16360 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
16370 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
16380 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16390 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
163a0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
163b0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
163c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
163d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
163e0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
163f0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
16400 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
16410 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
16420 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16430 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
16440 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
16450 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
16460 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
16470 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
16480 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
16490 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
164a0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
164b0 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
164c0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
164d0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
164e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
164f0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
16500 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
16510 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
16520 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
16530 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
16540 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
16550 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
16560 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
16570 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
16580 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
16590 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
165a0 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
165b0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
165c0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
165d0 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
165e0 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
165f0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
16600 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
16610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16620 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
16630 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
16640 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
16650 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
16660 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
16670 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
16680 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
16690 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
166a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
166b0 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
166c0 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  .  Each object i
166d0 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
166e0 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
166f0 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73 20 72  in size.  This r
16700 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
16710 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74   a new.** object
16720 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74   on the end of t
16730 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  he array..**.** 
16740 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68 65 20  *pnEntry is the 
16750 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
16760 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65  s already in use
16770 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a  .  *pnAlloc is.*
16780 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  * the previously
16790 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   allocated size 
167a0 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20 20 69  of the array.  i
167b0 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65 0a 2a  nitSize is the.*
167c0 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e 69 74  * suggested init
167d0 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65 20 61  ial array size a
167e0 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  llocation..**.**
167f0 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
16800 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 72  e new entry is r
16810 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49 64 78  eturned in *pIdx
16820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
16830 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 20 70  tine returns a p
16840 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72  ointer to the ar
16850 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
16860 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62   This.** might b
16870 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
16880 65 20 70 41 72 72 61 79 20 70 61 72 61 6d 65 74  e pArray paramet
16890 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  er or it might b
168a0 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  e a different.**
168b0 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68 65 20   pointer if the 
168c0 61 72 72 61 79 20 77 61 73 20 72 65 73 69 7a 65  array was resize
168d0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
168e0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
168f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
16900 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
16910 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
16920 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
16930 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
16940 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
16950 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
16960 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
16970 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
16980 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
16990 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
169a0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
169b0 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c  .  int initSize,
169c0 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74 65       /* Suggeste
169d0 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61  d initial alloca
169e0 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
169f0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  s */.  int *pnEn
16a00 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
16a10 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
16a20 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
16a30 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63  /.  int *pnAlloc
16a40 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ,     /* Current
16a50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
16a60 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
16a70 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
16a80 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
16a90 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
16aa0 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
16ab0 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
16ac0 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74 72  z;.  if( *pnEntr
16ad0 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b  y >= *pnAlloc ){
16ae0 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b  .    void *pNew;
16af0 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65  .    int newSize
16b00 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
16b10 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69  (*pnAlloc)*2 + i
16b20 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65  nitSize;.    pNe
16b30 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
16b40 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
16b50 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79   newSize*szEntry
16b60 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
16b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
16b80 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
16b90 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
16ba0 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20   }.    *pnAlloc 
16bb0 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70  = newSize;.    p
16bc0 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
16bd0 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
16be0 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
16bf0 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a  &z[*pnEntry * sz
16c00 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
16c10 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a  ry);.  *pIdx = *
16c20 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e  pnEntry;.  ++*pn
16c30 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
16c40 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
16c50 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
16c60 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
16c70 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
16c80 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
16c90 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
16ca0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
16cb0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
16cc0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
16cd0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
16ce0 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
16cf0 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
16d00 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
16d10 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
16d20 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
16d30 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
16d40 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
16d50 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
16d60 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
16d70 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
16d80 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
16d90 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
16da0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
16db0 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
16dc0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
16dd0 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
16de0 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
16df0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
16e00 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20  [0]),.      5,. 
16e10 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
16e20 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
16e30 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69  nAlloc,.      &i
16e40 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
16e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
16e60 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
16e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
16e80 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
16e90 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
16ea0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
16eb0 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
16ec0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
16ed0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
16ee0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
16ef0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
16f00 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
16f10 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
16f20 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
16f30 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
16f40 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
16f50 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
16f60 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  _free(pList->a[i
16f70 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
16f80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69  sqlite3_free(pLi
16f90 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
16fa0 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  3_free(pList);.}
16fb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16fc0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
16fd0 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
16fe0 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
16ff0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
17000 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
17010 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
17020 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
17030 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
17040 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
17050 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17060 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
17070 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
17080 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
17090 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
170a0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
170b0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
170c0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
170d0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
170e0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
170f0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
17100 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
17110 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
17120 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
17130 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
17140 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
17150 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
17160 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
17170 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
17180 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72  new SrcList is r
17190 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
171a0 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
171b0 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ls..**.** If pDa
171c0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
171d0 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
171e0 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
171f0 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
17200 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
17210 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
17220 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
17230 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
17240 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
17250 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
17260 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
17270 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
17280 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
17290 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
172a0 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
172b0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
172c0 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
172d0 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
172e0 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
172f0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
17300 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
17310 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
17320 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
17330 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
17340 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
17350 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
17360 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
17370 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
17380 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
17390 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
173a0 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
173b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
173c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
173d0 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a  end(D,A,B,0);.**
173e0 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
173f0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
17400 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
17410 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
17420 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
17430 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
17450 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
17460 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
17470 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
17480 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
17490 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
174a0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
174b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
174c0 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
174d0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
174e0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
174f0 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
17500 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
17510 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
17520 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
17530 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
17540 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
17550 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
17560 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
17570 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
17580 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
17590 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
175a0 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
175b0 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
175c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
175d0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
175e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
175f0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
17600 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
17610 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
17620 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
17630 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17640 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
17650 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  1;.  }.  if( pLi
17660 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d  st->nSrc>=pList-
17670 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
17680 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
17690 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
176a0 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d  *= 2;.    pNew =
176b0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
176c0 63 28 64 62 2c 20 70 4c 69 73 74 2c 0a 20 20 20  c(db, pList,.   
176d0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
176e0 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c  of(*pList) + (pL
176f0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ist->nAlloc-1)*s
17700 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
17710 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
17720 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
17730 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
17740 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
17750 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
17760 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
17770 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  ew;.  }.  pItem 
17780 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
17790 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73  t->nSrc];.  mems
177a0 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
177b0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
177c0 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  );.  if( pDataba
177d0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
177e0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
177f0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
17800 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
17810 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  && pTable ){.   
17820 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
17830 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
17840 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
17850 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
17860 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
17870 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
17880 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
17890 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
178a0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
178b0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
178c0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
178d0 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d  abase);.  pItem-
178e0 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  >iCursor = -1;. 
178f0 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
17900 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74  ted = 0;.  pList
17910 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
17920 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
17930 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
17940 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
17950 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
17960 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
17970 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
17980 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17990 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
179a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
179b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
179c0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
179d0 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65  (pList || pParse
179e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
179f0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73  ed );.  if( pLis
17a00 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
17a10 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
17a20 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
17a30 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
17a40 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
17a50 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72  >iCursor>=0 ) br
17a60 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  eak;.      pItem
17a70 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ->iCursor = pPar
17a80 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
17a90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
17aa0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
17ab0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
17ac0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
17ad0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
17ae0 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  ct->pSrc);.     
17af0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
17b00 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
17b10 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
17b20 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
17b30 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
17b40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
17b50 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
17b60 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
17b70 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
17b80 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
17b90 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
17ba0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
17bb0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
17bc0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
17bd0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
17be0 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
17bf0 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44  3_free(pItem->zD
17c00 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
17c10 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d  lite3_free(pItem
17c20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
17c30 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d  lite3_free(pItem
17c40 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73  ->zAlias);.    s
17c50 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
17c60 65 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  e(pItem->pTab);.
17c70 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
17c80 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  tDelete(pItem->p
17c90 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
17ca0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
17cb0 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
17cc0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
17cd0 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ete(pItem->pUsin
17ce0 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
17cf0 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  3_free(pList);.}
17d00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17d10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
17d20 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
17d30 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
17d40 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
17d50 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
17d60 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
17d70 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
17d80 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
17d90 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
17da0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17db0 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
17dc0 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
17dd0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
17de0 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
17df0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
17e00 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
17e10 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
17e20 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
17e30 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
17e40 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
17e50 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
17e60 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
17e70 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
17e80 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
17e90 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
17ea0 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
17eb0 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
17ec0 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70   a alias, then p
17ed0 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
17ee0 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
17ef0 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
17f00 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
17f10 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
17f20 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
17f30 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
17f40 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
17f50 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
17f60 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
17f70 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
17f80 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
17f90 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
17fa0 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
17fb0 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
17fc0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
17fd0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
17fe0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
17ff0 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
18000 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
18010 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
18020 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
18030 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
18040 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
18050 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
18060 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
18080 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18090 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
180a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
180b0 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
180c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
180d0 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
180e0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
180f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18100 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
18110 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
18120 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
18130 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
18140 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18150 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
18160 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
18170 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
18180 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
18190 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
181a0 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
181b0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
181c0 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
181d0 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
181e0 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
181f0 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
18200 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
18210 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
18220 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
18230 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
18240 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
18250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
18260 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
18270 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
18280 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18290 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
182a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
182b0 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69  ->db;.  p = sqli
182c0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
182d0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
182e0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
182f0 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72  ( p==0 || p->nSr
18300 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==0 ){.    sqli
18310 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4f  te3ExprDelete(pO
18320 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
18330 64 4c 69 73 74 44 65 6c 65 74 65 28 70 55 73 69  dListDelete(pUsi
18340 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
18350 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75  SelectDelete(pSu
18360 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65 74  bquery);.    ret
18370 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74  urn p;.  }.  pIt
18380 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
18390 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c  rc-1];.  if( pAl
183a0 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e  ias && pAlias->n
183b0 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
183c0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
183d0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
183e0 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
183f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
18400 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
18410 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
18420 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
18430 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
18440 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn p;.}../*.** W
18450 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
18460 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
18470 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
18480 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
18490 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
184a0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
184b0 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
184c0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
184d0 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
184e0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
184f0 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
18500 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
18510 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
18520 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
18530 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
18540 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
18550 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
18560 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
18570 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
18580 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
18590 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
185a0 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
185b0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
185c0 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
185d0 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
185e0 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
185f0 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
18600 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
18610 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
18620 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
18630 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
18640 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
18650 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
18660 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
18670 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
18680 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
18690 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
186a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
186b0 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
186c0 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
186d0 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20   && p->a ){.    
186e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
186f0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
18700 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
18710 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
18720 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
18730 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
18740 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
18750 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
18760 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
18770 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
18780 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
18790 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
187a0 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
187b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
187c0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
187d0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
187e0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
187f0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
18800 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
18810 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
18820 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
18830 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18840 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
18850 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18860 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
18870 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
18880 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
18890 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
188a0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
188b0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
188c0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
188d0 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
188e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
188f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
18900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
18920 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
18930 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
18940 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
18950 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
18960 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
18970 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
18980 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
18990 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
189a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
189b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
189c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
189d0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
189e0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
189f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18a00 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
18a10 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
18a20 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
18a30 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
18a40 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
18a50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
18a60 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
18a70 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
18a80 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18a90 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18aa0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
18ab0 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  N, "COMMIT", 0, 
18ac0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
18ad0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18ae0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18af0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
18b00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18b10 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
18b20 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
18b30 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
18b40 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
18b50 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
18b60 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
18b70 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
18b80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
18b90 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
18ba0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
18bb0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
18bc0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
18bd0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
18be0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
18bf0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18c00 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
18c10 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18c20 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
18c30 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
18c40 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
18c50 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
18c60 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18c70 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18c80 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
18c90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18ca0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
18cb0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
18cc0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
18cd0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
18ce0 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
18cf0 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
18d00 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
18d10 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
18d20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
18d30 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
18d40 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
18d50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18d60 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
18d70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
18d80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
18d90 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
18da0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
18db0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
18dc0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
18dd0 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74  int rc;.    stat
18de0 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
18df0 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
18e00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18e10 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
18e20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
18e30 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
18e40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
18e50 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
18e60 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
18e70 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
18e80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18e90 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
18ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
18eb0 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
18ec0 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46  0, 0, SQLITE_DEF
18ed0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c  AULT_CACHE_SIZE,
18ee0 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20   flags,.        
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f00 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44           &db->aD
18f10 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
18f20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18f30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18f40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18f50 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
18f60 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
18f70 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
18f80 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
18f90 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
18fa0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
18fb0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
18fc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
18fd0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
18fe0 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74  flags & !db->aut
18ff0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
19000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19010 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
19020 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b  >aDb[1].pBt, 1);
19030 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19050 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19060 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
19070 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
19080 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
19090 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
190a0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
190b0 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ile");.        p
190c0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
190d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
190e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
190f0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
19100 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
19110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
19130 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
19140 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
19150 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
19160 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
19170 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
19180 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
19190 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
191a0 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
191b0 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
191c0 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
191d0 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
191e0 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
191f0 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
19200 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
19210 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
19220 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
19230 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
19240 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
19250 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
19260 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
19270 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
19280 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
19290 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
192a0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
192b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
192c0 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
192d0 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a  an OP_Goto that.
192e0 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
192f0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
19300 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
19310 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
19320 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
19330 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
19340 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
19350 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
19360 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
19370 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
19380 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
19390 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
193a0 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
193b0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
193c0 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
193d0 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
193e0 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
193f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19400 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
19410 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  and the OP_Goto 
19420 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
19430 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
19440 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
19450 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
19460 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
19470 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
19480 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
19490 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
194a0 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
194b0 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ng()..**.** If i
194c0 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74  Db<0 then code t
194d0 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20  he OP_Goto only 
194e0 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67  - don't set flag
194f0 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a   to verify the.*
19500 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20  * schema on any 
19510 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73  databases.  This
19520 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
19530 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f  position the OP_
19540 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e  Goto.** early in
19550 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72   the code, befor
19560 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79  e we know if any
19570 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
19580 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
19590 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
195a0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
195b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
195c0 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65  t iDb){.  sqlite
195d0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
195e0 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20  ;.  int mask;.. 
195f0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
19600 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
19610 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
19620 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
19630 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
19640 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
19650 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  or */.  db = pPa
19660 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
19670 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
19680 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  o==0 ){.    pPar
19690 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
196a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
196b0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
196c0 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66  , 0)+1;.  }.  if
196d0 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iDb>=0 ){.    
196e0 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
196f0 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
19700 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
19710 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
19720 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19730 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
19740 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
19750 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
19760 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
19770 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
19780 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
19790 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
197a0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
197b0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
197c0 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
197d0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
197e0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
197f0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
19800 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
19810 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
19820 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
19830 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
19840 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
19860 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
19870 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
19880 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
19890 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
198a0 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
198b0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
198c0 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
198d0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
198e0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
198f0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
19900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
19910 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
19920 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
19930 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
19940 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
19950 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
19960 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
19970 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
19980 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
19990 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
199a0 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
199b0 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
199c0 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
199d0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
199e0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
199f0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
19a00 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
19a10 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
19a20 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
19a30 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
19a40 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
19a50 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
19a60 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
19a70 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
19a80 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
19a90 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
19aa0 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
19ab0 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
19ac0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
19ad0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
19ae0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
19af0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
19b00 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
19b10 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
19b20 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
19b30 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
19b40 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
19b50 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
19b60 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
19b70 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
19b80 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
19b90 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
19ba0 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
19bb0 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
19bc0 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
19bd0 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
19be0 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
19bf0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
19c00 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
19c10 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
19c20 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
19c30 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
19c40 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
19c50 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
19c60 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
19c70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
19c80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
19c90 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
19ca0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
19cb0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
19cc0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
19cd0 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
19ce0 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
19cf0 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
19d00 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
19d10 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
19d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d30 4f 70 31 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d  Op1(v, OP_Statem
19d40 65 6e 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  ent, iDb);.  }. 
19d50 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44   if( (OMIT_TEMPD
19d60 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20  B || iDb!=1) && 
19d70 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
19d80 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20  1].pBt!=0 ){.   
19d90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
19da0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
19db0 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
19dc0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
19dd0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19de0 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
19df0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
19e00 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
19e10 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
19e20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
19e30 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
19e40 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
19e50 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
19e60 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
19e70 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
19e80 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
19e90 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
19ea0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
19eb0 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
19ec0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
19ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
19ee0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
19ef0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f  ;.    if( z==zCo
19f00 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c  ll || (z && zCol
19f10 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  l && 0==sqlite3S
19f20 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
19f30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
19f40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
19f50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
19f60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
19f70 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
19f80 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
19f90 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
19fa0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
19fb0 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
19fc0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
19fd0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
19fe0 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
19ff0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1a000 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1a010 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1a020 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1a030 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1a040 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1a050 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1a060 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1a070 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1a080 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1a090 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1a0a0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1a0b0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1a0c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1a0d0 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1a0e0 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1a0f0 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1a100 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1a110 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1a120 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1a130 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1a140 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1a150 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1a160 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1a170 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1a180 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1a190 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1a1a0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1a1b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1a1c0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1a1d0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1a1e0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1a1f0 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1a200 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1a210 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1a220 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1a230 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1a240 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1a250 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1a260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a270 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1a280 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1a290 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1a2a0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1a2b0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1a2c0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1a2d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1a2e0 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1a2f0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a310 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1a320 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1a330 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1a340 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1a350 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1a360 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1a370 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1a380 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1a390 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1a3a0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1a3b0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1a3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1a3d0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1a3e0 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1a3f0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1a400 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1a410 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1a420 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1a430 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1a440 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1a450 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1a460 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1a470 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1a480 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1a490 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1a4a0 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1a4b0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1a4c0 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1a4d0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1a4e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1a4f0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1a500 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1a510 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1a520 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1a550 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1a560 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1a570 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1a580 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1a590 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1a5a0 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1a5b0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1a5c0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1a5d0 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1a5e0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1a5f0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1a600 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1a610 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1a620 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1a630 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1a640 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1a650 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1a660 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1a670 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1a680 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1a690 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1a6a0 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1a6b0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1a6c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1a6d0 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1a6e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a6f0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1a700 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1a710 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1a720 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1a730 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1a740 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1a750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a760 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1a770 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1a780 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1a790 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a7b0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1a7c0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1a7d0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1a7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1a7f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a800 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1a810 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1a820 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1a830 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1a840 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a860 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1a870 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1a880 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1a8b0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1a8c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a8d0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1a8e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1a8f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1a900 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1a910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1a920 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1a930 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1a940 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1a950 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1a960 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1a970 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1a980 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1a990 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1a9a0 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1a9b0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1a9c0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1a9d0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1a9e0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1a9f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1aa00 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1aa10 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30   || pName1->z==0
1aa20 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1aa30 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1aa40 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1aa50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
1aa60 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32  me2==0 || pName2
1aa70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
1aa80 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
1aa90 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
1aaa0 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
1aab0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1aac0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1aad0 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
1aae0 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
1aaf0 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
1ab00 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
1ab10 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
1ab20 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Coll, -1, 0);.  
1ab30 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1ab40 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29       if( zColl )
1ab50 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e 64 65  {.        reinde
1ab60 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
1ab70 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
1ab80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ab90 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
1aba0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1abb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1abc0 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  free(zColl);.  }
1abd0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1abe0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
1abf0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
1ac00 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
1ac10 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
1ac20 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
1ac30 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1ac40 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
1ac50 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
1ac60 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
1ac70 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
1ac80 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1ac90 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1aca0 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
1acb0 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
1acc0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1acd0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
1ace0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
1acf0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ad00 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1ad10 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
1ad20 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
1ad30 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  _free(z);.  if( 
1ad40 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
1ad50 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1ad60 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1ad70 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
1ad80 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1ad90 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1ada0 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
1adb0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1adc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1add0 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
1ade0 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
1adf0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
1ae00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1ae10 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d  * Return a dynam
1ae20 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b  icly allocated K
1ae30 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1ae40 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1ae50 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65  d.** with OP_Ope
1ae60 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
1ae70 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  Write to access 
1ae80 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70  database index p
1ae90 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
1aea0 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
1aeb0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1aec0 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
1aed0 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
1aee0 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  se.** the caller
1aef0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1af00 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  for calling sqli
1af10 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 74 68  te3_free() on th
1af20 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70  e returned .** p
1af30 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72  ointer. If an er
1af40 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20  ror occurs (out 
1af50 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73  of memory or mis
1af60 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  sing collation .
1af70 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55  ** sequence), NU
1af80 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
1af90 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  nd the state of 
1afa0 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74  pParse updated t
1afb0 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65  o reflect.** the
1afc0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e   error..*/.KeyIn
1afd0 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78  fo *sqlite3Index
1afe0 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70  Keyinfo(Parse *p
1aff0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
1b000 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
1b010 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
1b020 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
1b030 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28  nBytes = sizeof(
1b040 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c  KeyInfo) + (nCol
1b050 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  -1)*sizeof(CollS
1b060 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b  eq*) + nCol;.  K
1b070 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28  eyInfo *pKey = (
1b080 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65  KeyInfo *)sqlite
1b090 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
1b0a0 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 73  arse->db, nBytes
1b0b0 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1b0c0 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d  {.    pKey->db =
1b0d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
1b0e0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
1b0f0 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79  r = (u8 *)&(pKey
1b100 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  ->aColl[nCol]);.
1b110 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65      assert( &pKe
1b120 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  y->aSortOrder[nC
1b130 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b  ol]==&(((u8 *)pK
1b140 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a  ey)[nBytes]) );.
1b150 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1b160 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1b170 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1b180 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1b190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1b1a0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  oll );.      pKe
1b1b0 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
1b1c0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1b1d0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1b1e0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65  , -1);.      pKe
1b1f0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
1b200 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
1b210 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
1b220 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d    pKey->nField =
1b230 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66   nCol;.  }..  if
1b240 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1b250 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1b260 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b  ee(pKey);.    pK
1b270 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1b280 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a           turn pKey;.}.