/ Hex Artifact Content
Login

Artifact 580561a0d9e070ff2741f3b115cae51c1ef08260:


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 30 20 32 30 30 37 2f 31 32 2f 30 34  1.450 2007/12/04
02f0: 20 31 36 3a 35 34 3a 35 33 20 64 72 68 20 45 78   16:54:53 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 4f 70 33 28 70 56 64 62 65  te3VdbeOp3(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
0d30: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  );.  }.}.#else. 
0d40: 20 23 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62   #define codeTab
0d50: 6c 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69  leLocks(x).#endi
0d60: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
0d70: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
0d80: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53  after a single S
0d90: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  QL statement has
0da0: 20 62 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20   been.** parsed 
0db0: 61 6e 64 20 61 20 56 44 42 45 20 70 72 6f 67 72  and a VDBE progr
0dc0: 61 6d 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  am to execute th
0dd0: 61 74 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  at statement has
0de0: 20 62 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65   been.** prepare
0df0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
0e00: 20 70 75 74 73 20 74 68 65 20 66 69 6e 69 73 68   puts the finish
0e10: 69 6e 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74  ing touches on t
0e20: 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
0e30: 61 6d 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  am and resets th
0e40: 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
0e50: 72 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  re for the next.
0e60: 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  ** parse..**.** 
0e70: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 61 6e 20  Note that if an 
0e80: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
0e90: 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
0ea0: 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20  case that.** no 
0eb0: 56 44 42 45 20 63 6f 64 65 20 77 61 73 20 67 65  VDBE code was ge
0ec0: 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  nerated..*/.void
0ed0: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0ee0: 64 69 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72  ding(Parse *pPar
0ef0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
0f00: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
0f10: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0f20: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
0f30: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
0f40: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
0f50: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
0f60: 6e 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  n;.  if( !pParse
0f70: 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 69  ->pVdbe ){.    i
0f80: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
0f90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 72  QLITE_OK && pPar
0fa0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
0fb0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
0fc0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
0fd0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0fe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
0ff0: 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73   by generating s
1000: 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  ome termination 
1010: 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20  code at the end 
1020: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65  of the.  ** vdbe
1030: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20   program.  */.  
1040: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1050: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1060: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1070: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1080: 50 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a  P_Halt, 0, 0);..
1090: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
10a0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
10b0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
10d0: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
10e0: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
10f0: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1100: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1110: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1120: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1130: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1140: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1150: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
1160: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1170: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
1180: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
1190: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
11a0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
11b0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
11c0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
11d0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
11e0: 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20  ookieGoto>0 ){. 
11f0: 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20       u32 mask;. 
1200: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
1210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1220: 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73  umpHere(v, pPars
1230: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29  e->cookieGoto-1)
1240: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
1250: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
1260: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
1270: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
1280: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
1290: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
12a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
12b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
12d0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
12e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12f0: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
1300: 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20  n, iDb, (mask & 
1310: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1320: 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  k)!=0);.        
1330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1340: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
1350: 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65  kie, iDb, pParse
1360: 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
1370: 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  b]);.      }.#if
1380: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1390: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13a0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
13b0: 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20 29 7b 0a  pVirtualLock ){.
13c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74          char *vt
13d0: 61 62 20 3d 20 28 63 68 61 72 20 2a 29 70 50 61  ab = (char *)pPa
13e0: 72 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63  rse->pVirtualLoc
13f0: 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20  k->pVtab;.      
1400: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
1410: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1420: 2c 20 30 2c 20 76 74 61 62 2c 20 50 33 5f 56 54  , 0, vtab, P3_VT
1430: 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  AB);.      }.#en
1440: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1450: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1460: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1470: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1480: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
1490: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
14a0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
14b0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
14c0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
14d0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
14e0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
14f0: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1500: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1510: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1520: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1540: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
1550: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
1560: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
1570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1580: 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 20  CE.    /* Add a 
1590: 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e 74 61  No-op that conta
15a0: 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ins the complete
15b0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6d   text of the com
15c0: 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a  piled SQL.    **
15d0: 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74   statement as it
15e0: 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e 20 20  s P3 argument.  
15f0: 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 68  This does not ch
1600: 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74 69 6f  ange the functio
1610: 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66  nality.    ** of
1620: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20   the program. . 
1630: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1640: 73 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  s is used to imp
1650: 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 74  lement sqlite3_t
1660: 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  race()..    */. 
1670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
1680: 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20 30 2c  3(v, OP_Noop, 0,
1690: 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c   0, pParse->zSql
16a0: 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69 6c 2d  , pParse->zTail-
16b0: 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b 0a 23  pParse->zSql);.#
16c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16d0: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20  OMIT_TRACE */.  
16e0: 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  }...  /* Get the
16f0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
1700: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
1710: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
1720: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
1730: 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  0 && !db->malloc
1740: 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66  Failed ){.#ifdef
1750: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1760: 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20    FILE *trace = 
1770: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
1780: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d  ITE_VdbeTrace)!=
1790: 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a  0 ? stdout : 0;.
17a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
17b0: 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a  race(v, trace);.
17c0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
17d0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
17e0: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
17f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c   pParse->nMem+3,
1800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1810: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1820: 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65  ->nTab+3, pParse
1830: 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  ->explain);.    
1840: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1850: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50  ITE_DONE;.    pP
1860: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
1870: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
1880: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
1890: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a0: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
18b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
18c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
18d0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
18e0: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
18f0: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
1900: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
1910: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
1920: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  ask = 0;.  pPars
1930: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
1940: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
1950: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63  the parser and c
1960: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65  ode generator re
1970: 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64  cursively in ord
1980: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a  er to generate.*
1990: 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  * code for the S
19a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  QL statement giv
19b0: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  en onto the end 
19c0: 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f  of the pParse co
19d0: 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74  ntext.** current
19e0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
19f0: 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65  ction.  When the
1a00: 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72   parser is run r
1a10: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68  ecursively.** th
1a20: 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61  is way, the fina
1a30: 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74  l OP_Halt is not
1a40: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74   appended and ot
1a50: 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  her initializati
1a60: 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69  on.** and finali
1a70: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65  zation steps are
1a80: 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65   omitted because
1a90: 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c   those are handl
1aa0: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75  ing by the.** ou
1ab0: 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a  termost parser..
1ac0: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74  **.** Not everyt
1ad0: 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65  hing is nestable
1ae0: 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79  .  This facility
1af0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
1b00: 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54  permit.** INSERT
1b10: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
1b20: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1b30: 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d  against SQLITE_M
1b40: 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63  ASTER.  Use.** c
1b50: 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64  are if you decid
1b60: 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20  e to try to use 
1b70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  this routine for
1b80: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1b90: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
1ba0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1bb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1bd0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
1be0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
1bf0: 2a 7a 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20  *zSql;.# define 
1c00: 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66  SAVE_SZ  (sizeof
1c10: 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74  (Parse) - offset
1c20: 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a  of(Parse,nVar)).
1c30: 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53    char saveBuf[S
1c40: 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20  AVE_SZ];..  if( 
1c50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
1c60: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
1c70: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c   pParse->nested<
1c80: 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e  10 );  /* Nestin
1c90: 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  g should only be
1ca0: 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74   of limited dept
1cb0: 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28  h */.  va_start(
1cc0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1cd0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d  zSql = sqlite3VM
1ce0: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
1cf0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
1d00: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1d10: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
1d20: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
1d30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1d40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  ;.    return;   
1d50: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1d60: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1d70: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1d80: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1d90: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1da0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1db0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1dc0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1dd0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1de0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1df0: 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73  e, zSql, 0);.  s
1e00: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1e10: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
1e20: 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42  rse->nVar, saveB
1e30: 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  uf, SAVE_SZ);.  
1e40: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d  pParse->nested--
1e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
1e60: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
1e70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
1e80: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
1e90: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
1ea0: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
1eb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
1ec0: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
1ed0: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
1ee0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1ef0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1f00: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1f10: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1f20: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
1f30: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
1f40: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
1f50: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74  arched for the t
1f60: 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  able and the.** 
1f70: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74  first matching t
1f80: 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  able is returned
1f90: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .  (No checking 
1fa0: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61  for duplicate ta
1fb0: 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20  ble.** names is 
1fc0: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
1fd0: 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50  ch order is TEMP
1fe0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
1ff0: 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61  N, then any.** a
2000: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2010: 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74  es added using t
2020: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
2030: 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
2040: 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  o sqlite3LocateT
2050: 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65  able()..*/.Table
2060: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62   *sqlite3FindTab
2070: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
2080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62  Database){.  Tab
20b0: 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  le *p = 0;.  int
20c0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e   i;.  assert( zN
20d0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ame!=0 );.  for(
20e0: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
20f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2100: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
2110: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
2120: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2130: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2140: 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d   if( zDatabase!=
2150: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
2160: 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64  Cmp(zDatabase, d
2170: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2190: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
21a0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  Find(&db->aDb[j]
21b0: 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
21c0: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
21d0: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
21e0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
21f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2200: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2210: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2220: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2230: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
2240: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
2250: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2260: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2270: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2280: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2290: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
22a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
22b0: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
22c0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
22d0: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
22e0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
22f0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2300: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
2310: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2320: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
2330: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2340: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2350: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2360: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2370: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2380: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2390: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
23a0: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
23b0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
23c0: 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73 65  ocateTable(Parse
23d0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
23e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
23f0: 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29  st char *zDbase)
2400: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20  {.  Table *p;.. 
2410: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2420: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2430: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2440: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2450: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2460: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2470: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2480: 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
2490: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
24a0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
24b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
24c0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
24d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
24e0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
24f0: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
2500: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
2510: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2520: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2530: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
2540: 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a  table: %s.%s", z
2550: 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  Dbase, zName);. 
2560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2570: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2580: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
2590: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
25a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
25b0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
25c0: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
25d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
25e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
25f0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2600: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
2610: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
2620: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
2630: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
2640: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
2650: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2660: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
2670: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
2680: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2690: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
26a0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
26b0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
26c0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
26d0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
26e0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
26f0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
2700: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2710: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
2720: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
2730: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2740: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2750: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
2760: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
2770: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
2780: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
2790: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
27a0: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
27b0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
27c0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
27d0: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
27e0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
27f0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
2800: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2810: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2820: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2830: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2840: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2850: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
2860: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
2870: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
2880: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
2890: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
28a0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
28b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
28c0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
28d0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
28e0: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
28f0: 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21  ma || (j==1 && !
2900: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20  db->aDb[1].pBt) 
2910: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  );.    if( pSche
2920: 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  ma ){.      p = 
2930: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2940: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
2950: 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  h, zName, strlen
2960: 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  (zName)+1);.    
2970: 7d 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  }.    if( p ) br
2980: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2990: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
29a0: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
29b0: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
29c0: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  x.*/.static void
29d0: 20 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78   freeIndex(Index
29e0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   *p){.  sqlite3_
29f0: 66 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  free(p->zColAff)
2a00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2a10: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
2a20: 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69  move the given i
2a30: 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndex from the in
2a40: 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20  dex hash table, 
2a50: 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20  and free.** its 
2a60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2a70: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  s..**.** The ind
2a80: 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ex is removed fr
2a90: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2aa0: 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a  hash tables but.
2ab0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c  ** it is not unl
2ac0: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54  inked from the T
2ad0: 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64  able that it ind
2ae0: 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69  exes..** Unlinki
2af0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ng from the Tabl
2b00: 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62  e must be done b
2b10: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
2b20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2b30: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
2b40: 65 74 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  eteIndex(Index *
2b50: 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c  p){.  Index *pOl
2b60: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
2b70: 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d  *zName = p->zNam
2b80: 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c  e;..  pOld = sql
2b90: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
2ba0: 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  p->pSchema->idxH
2bb0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ash, zName, strl
2bc0: 65 6e 28 20 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  en( zName)+1, 0)
2bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64  ;.  assert( pOld
2be0: 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29  ==0 || pOld==p )
2bf0: 3b 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29  ;.  freeIndex(p)
2c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  ;.}../*.** For t
2c10: 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20  he index called 
2c20: 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69  zIdxName which i
2c30: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64  s found in the d
2c40: 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20  atabase iDb,.** 
2c50: 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65  unlike that inde
2c60: 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65  x from its Table
2c70: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
2c80: 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74   index from.** t
2c90: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2ca0: 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ble and free all
2cb0: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
2cc0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  es associated.**
2cd0: 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e   with the index.
2ce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2cf0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
2d00: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2d10: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
2d20: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
2d30: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
2d40: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  x;.  int len;.  
2d50: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64  Hash *pHash = &d
2d60: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
2d70: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20  ema->idxHash;.. 
2d80: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2d90: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2da0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2db0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
2dc0: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
2dd0: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2de0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2df0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2e00: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2e10: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2e20: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2e30: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2e40: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2e50: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2e60: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2e70: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2e80: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2e90: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2ea0: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2eb0: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2ec0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2ed0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2ee0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2ef0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2f00: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2f10: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2f20: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2f40: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
2f50: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
2f60: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2f70: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2f80: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2f90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2fa0: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2fb0: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
2fc0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2fd0: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
2fe0: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2ff0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
3000: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
3010: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
3020: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
3030: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
3040: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
3050: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
3060: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
3070: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3080: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
3090: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
30a0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
30b0: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
30c0: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
30d0: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
30e0: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
30f0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
3100: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3110: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
3120: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
3130: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
3140: 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28  i, j;..  assert(
3150: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
3160: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 66 6f 72 28  b->nDb );.  for(
3170: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
3180: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
3190: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
31a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
31b0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
31c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72   sqlite3SchemaFr
31d0: 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ee(pDb->pSchema)
31e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31f0: 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb>0 ) return;.
3200: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44    }.  assert( iD
3210: 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c  b==0 );.  db->fl
3220: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3230: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20  nternChanges;.. 
3240: 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f   /* If one or mo
3250: 72 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69  re of the auxili
3260: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
3270: 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  es has been clos
3280: 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  ed,.  ** then re
3290: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
32a0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
32b0: 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20  abase list.  We 
32c0: 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70  take the.  ** op
32d0: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20  portunity to do 
32e0: 74 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20  this here since 
32f0: 77 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c  we have just del
3300: 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a  eted all of the.
3310: 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68    ** schema hash
3320: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72   tables and ther
3330: 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76  efore do not hav
3340: 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68  e to make any ch
3350: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e  anges.  ** to an
3360: 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65  y of those table
3370: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
3380: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
3390: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
33a0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
33b0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
33c0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
33d0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78     if( pDb->pAux
33e0: 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75   && pDb->xFreeAu
33f0: 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75  x ) pDb->xFreeAu
3400: 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20  x(pDb->pAux);.  
3410: 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20      pDb->pAux = 
3420: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  0;.    }.  }.  f
3430: 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e  or(i=j=2; i<db->
3440: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nDb; i++){.    s
3450: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
3460: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3470: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
3480: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3490: 33 5f 66 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  3_free(pDb->zNam
34a0: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
34b0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
34c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
34d0: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
34e0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
34f0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
3500: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
3510: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
3520: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
3530: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
3540: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
3550: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3560: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
3570: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
3580: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
3590: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
35a0: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
35b0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
35c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
35d0: 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  ee(db->aDb);.   
35e0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
35f0: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
3600: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3610: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3620: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
3630: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
3640: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
3650: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
3660: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
3670: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
3680: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3690: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
36a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
36b0: 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  m a table or vie
36c0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
36d0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c  d sqliteResetCol
36e0: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
36f0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
3700: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
3710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
3720: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
3730: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
3740: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
3750: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
3760: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
3770: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
3780: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3790: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
37a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
37b0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
37c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
37d0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
37e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37f0: 28 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20  (pCol->zColl);. 
3800: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3810: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  _free(pTable->aC
3820: 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ol);.  }.  pTabl
3830: 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70  e->aCol = 0;.  p
3840: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
3850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3860: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3870: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3880: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3890: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
38a0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
38b0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
38c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
38d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
38e0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
38f0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3900: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3910: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3920: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3930: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3940: 74 61 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73  table.  Nor does
3950: 20 69 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f   it remove.** fo
3960: 72 65 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20  reign keys from 
3970: 74 68 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79  the sqlite.aFKey
3980: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
3990: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
39a0: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
39b0: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
39c0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
39d0: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
39e0: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
39f0: 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
3a00: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
3a10: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3a20: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
3a30: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79  , *pNext;.  FKey
3a40: 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46   *pFKey, *pNextF
3a50: 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Key;..  if( pTab
3a60: 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
3a70: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
3a80: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
3a90: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
3aa0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
3ab0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c  zero. */.  pTabl
3ac0: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
3ad0: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
3ae0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
3af0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
3b00: 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ble->nRef==0 );.
3b10: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3b20: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3b30: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3b40: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3b50: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3b60: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3b70: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3b80: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3b90: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
3ba0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
3bb0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
3bc0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
3bd0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
3be0: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69  pIndex);.  }..#i
3bf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3c00: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
3c10: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
3c20: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3c30: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3c40: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
3c50: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
3c60: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
3c70: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
3c80: 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 20   pSchema->aFKey 
3c90: 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f  hash table .  */
3ca0: 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61  .  for(pFKey=pTa
3cb0: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
3cc0: 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b  y; pFKey=pNextFK
3cd0: 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b  ey){.    pNextFK
3ce0: 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78  ey = pFKey->pNex
3cf0: 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72  tFrom;.    asser
3d00: 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  t( sqlite3HashFi
3d10: 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68  nd(&pTable->pSch
3d20: 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20  ema->aFKey,.    
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54         pFKey->zT
3d50: 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d  o, strlen(pFKey-
3d60: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
3d70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
3d80: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
3d90: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c  #endif..  /* Del
3da0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
3db0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
3dc0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73    */.  sqliteRes
3dd0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
3de0: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
3df0: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  _free(pTable->zN
3e00: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
3e10: 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f  free(pTable->zCo
3e20: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
3e30: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61  SelectDelete(pTa
3e40: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
3e50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3e60: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
3e70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 54 61  e3ExprDelete(pTa
3e80: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65  ble->pCheck);.#e
3e90: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 74  ndif.  sqlite3Vt
3ea0: 61 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29 3b  abClear(pTable);
3eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3ec0: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
3ed0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
3ee0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
3ef0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
3f00: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
3f10: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
3f20: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
3f30: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
3f40: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
3f50: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
3f60: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3f70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
3f80: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
3f90: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
3fa0: 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a  ble *p;.  FKey *
3fb0: 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20  pF1, *pF2;.  Db 
3fc0: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
3fd0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
3fe0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
3ff0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
4000: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
4010: 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29  && zTabName[0] )
4020: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
4030: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
4040: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4050: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
4060: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
4070: 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e 61  e, strlen(zTabNa
4080: 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20  me)+1,0);.  if( 
4090: 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  p ){.#ifndef SQL
40a0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
40b0: 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 31  _KEY.    for(pF1
40c0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20  =p->pFKey; pF1; 
40d0: 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72  pF1=pF1->pNextFr
40e0: 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  om){.      int n
40f0: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d  To = strlen(pF1-
4100: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
4110: 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48 61   pF2 = sqlite3Ha
4120: 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53 63  shFind(&pDb->pSc
4130: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31  hema->aFKey, pF1
4140: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
4150: 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20     if( pF2==pF1 
4160: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4170: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
4180: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  b->pSchema->aFKe
4190: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
41a0: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
41b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
41c0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
41d0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
41e0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
41f0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
4200: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
4210: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
4220: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
4230: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
4240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
4250: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
4260: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29 3b  3DeleteTable(p);
4270: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
4280: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
4290: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
42a0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
42b0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
42c0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
42d0: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
42e0: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74  hat.** token wit
42f0: 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73  h any quotations
4300: 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65   removed.  Space
4310: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
4320: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4330: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
4340: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
4350: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
4360: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
4370: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
4380: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4390: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
43a0: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
43b0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
43c0: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
43d0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
43e0: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
43f0: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4400: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4410: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4420: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4430: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4440: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4450: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4460: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4470: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4480: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4490: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
44a0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
44b0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
44c0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
44d0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
44e0: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
44f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4500: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4520: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4530: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4540: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4550: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4560: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4570: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4580: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4590: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
45a0: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
45b0: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
45c0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
45d0: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
45e0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
45f0: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
4600: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
4610: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
4620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4630: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
4640: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
4650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
4660: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
4670: 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c  TER_ROOT);.  sql
4680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4690: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
46a0: 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c  s, 0, 5); /* sql
46b0: 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35  ite_master has 5
46c0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f   columns */.}../
46d0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
46e0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
46f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
4700: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4710: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4720: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4730: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4740: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4750: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4760: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4770: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4780: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4790: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
47a0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
47b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
47c0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
47d0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
47e0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
47f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4800: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
4810: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
4820: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4830: 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a  rs in the name *
4840: 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  /.  Db *pDb;    
4850: 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61 73 65     /* A database
4860: 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70 61 63   whose name spac
4870: 65 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  e is being searc
4880: 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  hed */.  char *z
4890: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
48a0: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
48b0: 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65   for */..  zName
48c0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
48d0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
48e0: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
48f0: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  ){.    n = strle
4900: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  n(zName);.    fo
4910: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
4920: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4930: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4940: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4950: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4960: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72  i!=1 ) && n==str
4970: 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  len(pDb->zName) 
4980: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4990: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
49a0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
49b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
49c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
49d0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
49e0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ree(zName);.  }.
49f0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4a00: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
4a10: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
4a20: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
4a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
4a40: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
4a50: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
4a60: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
4a70: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
4a80: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
4a90: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
4aa0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
4ab0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
4ac0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4ad0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
4ae0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
4af0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
4b00: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
4b10: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
4b20: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
4b30: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4b40: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
4b50: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4b60: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
4b70: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
4b80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4b90: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
4ba0: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
4bb0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
4bc0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
4bd0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
4be0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
4bf0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
4c00: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
4c10: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
4c20: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
4c30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
4c40: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
4c50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4c60: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
4c70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
4c80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
4c90: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
4ca0: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
4cb0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
4cc0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
4cd0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4ce0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
4cf0: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
4d00: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
4d10: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
4d20: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
4d30: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
4d40: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
4d50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
4d80: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
4d90: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
4da0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4db0: 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26  ..  if( pName2 &
4dc0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
4dd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
4de0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
4df0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
4e00: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
4e10: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
4e20: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
4e30: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
4e40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4e50: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
4e60: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
4e70: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
4e80: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
4e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
4ea0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
4eb0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4ec0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
4ed0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
4ee0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
4ef0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
4f00: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
4f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
4f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4f30: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
4f40: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
4f50: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
4f60: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
4f70: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
4f80: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
4f90: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
4fa0: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
4fb0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
4fc0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
4fd0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
4fe0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
4ff0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
5000: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
5010: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
5020: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
5030: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
5040: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
5050: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5060: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
5070: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5080: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
5090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
50a0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
50b0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
50c0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
50d0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
50e0: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
50f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5100: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
5110: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
5120: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
5130: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5140: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5150: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5160: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5170: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
5180: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
5190: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
51a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
51b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
51c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
51d0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
51e0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
51f0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
5200: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
5210: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
5220: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
5230: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5240: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5250: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5260: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5270: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
5280: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
5290: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
52a0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
52b0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
52c0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
52d0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
52e0: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
52f0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
5300: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
5310: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5320: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5330: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5340: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5350: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5360: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5370: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5380: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5390: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
53a0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
53b0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
53c0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
53d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
53e0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
53f0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
5400: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
5410: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5420: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5430: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5440: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5450: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5460: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5470: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
5480: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
5490: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
54a0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
54b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
54c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
54d0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
54e0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
54f0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
5500: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
5510: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
5520: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
5530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5540: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5550: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5560: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5570: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5580: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
5590: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
55a0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
55b0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
55c0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
55d0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
55e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
55f0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
5600: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
5610: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5620: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
5630: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
5640: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5650: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5660: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
5670: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
5680: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
5690: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
56a0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
56b0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
56c0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
56d0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
56e0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
56f0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
5700: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
5710: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
5720: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5730: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
5740: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
5750: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5760: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
5770: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
5780: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
5790: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
57a0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
57b0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
57c0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
57d0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
57e0: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
57f0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5800: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5810: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
5820: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5830: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5840: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5850: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5860: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5870: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5880: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
5890: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
58a0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
58b0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
58c0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
58d0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
58e0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
58f0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5900: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
5910: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5920: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5930: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5940: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5950: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5960: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5970: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5980: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5990: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
59a0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
59b0: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
59c0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
59d0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
59e0: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
59f0: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5a00: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
5a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
5a20: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5a30: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5a40: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5a50: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5a60: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5a70: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5a80: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5a90: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5aa0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
5ab0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5ac0: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5ad0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
5ae0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5af0: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5b00: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
5b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5b20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
5b30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5b40: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5b50: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
5b60: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5b70: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5b80: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5b90: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
5ba0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
5bb0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
5bc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5bd0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5be0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
5bf0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
5c00: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
5c10: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
5c20: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
5c30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5c40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5c50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5c60: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5c70: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5c80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5c90: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5ca0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5cb0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5cc0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5cd0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5ce0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
5cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
5d00: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
5d10: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
5d20: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
5d30: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
5d40: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5d50: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5d60: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
5d70: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
5d80: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5d90: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5da0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5db0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
5dc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5dd0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5de0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
5df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5e00: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
5e10: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5e20: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5e30: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5e40: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
5e50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5e60: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5e70: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5e90: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
5ea0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
5eb0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
5ec0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
5ed0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5ee0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5ef0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
5f00: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
5f10: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
5f20: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
5f30: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
5f40: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
5f50: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
5f60: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
5f70: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
5f80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
5f90: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
5fa0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
5fb0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
5fc0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
5fd0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
5fe0: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
5ff0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6000: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6010: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6020: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6030: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6040: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6050: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6060: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6070: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6080: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6090: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
60a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
60b0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
60c0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
60d0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
60e0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
60f0: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
6100: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
6110: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
6120: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
6130: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
6140: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
6150: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
6160: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6170: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
6180: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
6190: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
61a0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
61b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
61c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
61d0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
61e0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
61f0: 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64  && (iDb==0 || !d
6200: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
6210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6220: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6230: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
6240: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
6250: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6260: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6270: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6280: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
6290: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
62a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
62b0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
62c0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
62d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
62e0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
62f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6300: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
6310: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
6320: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6330: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
6340: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
6350: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
6360: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
6370: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
6380: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
6390: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
63a0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72   = 1;.  if( pPar
63b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
63c0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
63d0: 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  le(pParse->pNewT
63e0: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
63f0: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
6400: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
6410: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
6420: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
6430: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
6440: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
6450: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
6460: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
6470: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
6480: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
6490: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
64a0: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
64b0: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
64c0: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
64d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
64e0: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
64f0: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
6500: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
6510: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
6520: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ce")==0 ){.    p
6530: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
6540: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
6550: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6560: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
6570: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
6580: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
6590: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
65a0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
65b0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
65c0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
65d0: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
65e0: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
65f0: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
6600: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
6610: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
6620: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
6630: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
6640: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
6650: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
6660: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
6670: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
6680: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
6690: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
66a0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
66b0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
66c0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
66d0: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
66e0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
66f0: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
6700: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
6710: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
6720: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
6730: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
6740: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
6750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
6760: 6c 62 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  lbl;.    int fil
6770: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c  eFormat;.    sql
6780: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6790: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
67a0: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
67b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
67c0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
67d0: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
67e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
67f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65  eAddOp(v, OP_VBe
6800: 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  gin, 0, 0);.    
6810: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
6820: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
6830: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
6840: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
6850: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6860: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6870: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
68a0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
68b0: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
68c0: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
68d0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
68e0: 20 69 44 62 29 3b 0a 20 20 20 20 6c 62 6c 20 3d   iDb);.    lbl =
68f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
6900: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71  Label(v);.    sq
6910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6920: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29  , OP_If, 0, lbl)
6930: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
6940: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6950: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
6960: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
6980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
6990: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
69a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
69b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
69c0: 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  eFormat, 0);.   
69d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69e0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
69f0: 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  e, iDb, 1);.    
6a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a10: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6a20: 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  ENC(db), 0);.   
6a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6a40: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
6a50: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
6a60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6a70: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
6a80: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6a90: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6aa0: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6ab0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6ac0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6ad0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6ae0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6af0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6b00: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6b10: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6b20: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6b30: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6b40: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6b50: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6b60: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6b70: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6b80: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e  entry is left on
6b90: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
6ba0: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68  stack..    ** Th
6bb0: 65 20 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73  e rowid value is
6bc0: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
6bd0: 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
6be0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20  EndTable will.  
6bf0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20    ** generate.. 
6c00: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
6c10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
6c20: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
6c30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
6c40: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
6c50: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
6c60: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
6c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6c90: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
6ca0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6cc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
6cd0: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b  eTable, iDb, 0);
6ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6cf0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
6d00: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
6d10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d20: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
6d30: 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  wid, 0, 0);.    
6d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d50: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
6d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6d70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
6d80: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ll, 0, 0);.    s
6d90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6da0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
6db0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
6dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6dd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
6de0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
6df0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6e00: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
6e10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
6e20: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
6e30: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
6e40: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
6e50: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
6e60: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
6e70: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
6e80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6e90: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
6ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6eb0: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
6ec0: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
6ed0: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
6ee0: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
6ef0: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
6f00: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
6f10: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
6f20: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
6f30: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
6f40: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
6f50: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
6f60: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
6f70: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
6f80: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
6f90: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
6fa0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
6fb0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
6fc0: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
6fd0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
6fe0: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
6ff0: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
7000: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7010: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
7020: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
7030: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7040: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
7050: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
7060: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
7070: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
7080: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
7090: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
70a0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
70b0: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
70c0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
70d0: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
70e0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
70f0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
7100: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
7110: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7120: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
7130: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
7140: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
7150: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
7160: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
7170: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
7180: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
7190: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
71a0: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
71b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
71c0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
71d0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
71e0: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
71f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
7200: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7210: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7220: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  rn;.  if( p->nCo
7230: 6c 2b 31 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43  l+1>SQLITE_MAX_C
7240: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c  OLUMN ){.    sql
7250: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7260: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
7270: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
7280: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
7290: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  turn;.  }.  z = 
72a0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
72b0: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
72c0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
72d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
72e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
72f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7300: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7310: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7320: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7330: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7340: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
7350: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
7360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7370: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7380: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
7390: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
73a0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
73b0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
73c0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
73d0: 44 62 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65  DbRealloc(pParse
73e0: 2d 3e 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d  ->db,p->aCol,(p-
73f0: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
7400: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
7410: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
7420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7430: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7440: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7450: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
7460: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
7470: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
7480: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
7490: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
74a0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
74b0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
74c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
74d0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
74e0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
74f0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
7500: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7510: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
7520: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
7530: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
7540: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
7550: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
7560: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
7570: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
7580: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
7590: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
75a0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
75b0: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
75c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
75d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
75e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
75f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7600: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7610: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7620: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7630: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7640: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7650: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
7660: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7670: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
7680: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
7690: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
76a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
76b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
76c0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
76d0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
76e0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
76f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
7700: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7710: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7720: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
7730: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
7740: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
7750: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
7760: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7770: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
7780: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
7790: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
77a0: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
77b0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
77c0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
77d0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
77e0: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
77f0: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
7800: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
7810: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
7820: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
7830: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
7840: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
7850: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
7860: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
7870: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
7880: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
7890: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
78a0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
78b0: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
78c0: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
78d0: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
78e0: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
78f0: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
7900: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
7910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7920: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
7930: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
7940: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
7950: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
7980: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7990: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
79a0: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
79b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
79c0: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
79d0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
79e0: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
79f0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7a00: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
7a10: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7a20: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
7a30: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7a40: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
7a50: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
7a60: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7a70: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
7a80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7a90: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
7aa0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7ab0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7ac0: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7ad0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7ae0: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7af0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7b00: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7b10: 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  t Token *pType){
7b20: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
7b30: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
7b40: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7b50: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7b60: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70  char *zIn = pTyp
7b70: 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  e->z;.  const un
7b80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
7b90: 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54  d = &pType->z[pT
7ba0: 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c  ype->n];..  whil
7bb0: 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a  e( zIn!=zEnd ){.
7bc0: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
7bd0: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
7be0: 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20  ower[*zIn];.    
7bf0: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
7c00: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
7c10: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
7c20: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
7c30: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
7c40: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7c50: 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20  E_AFF_TEXT; .   
7c60: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7c70: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
7c80: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
7c90: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
7ca0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
7cb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7cc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7cd0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
7ce0: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
7cf0: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
7d00: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
7d10: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7d20: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7d30: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
7d40: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7d50: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
7d60: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
7d70: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
7d80: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7d90: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
7da0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
7db0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7dc0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e  E_AFF_NONE;.#ifn
7dd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7de0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
7df0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7e00: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
7e10: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
7e20: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
7e30: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
7e40: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7e50: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7e60: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7e70: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
7e80: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
7e90: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7ea0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
7eb0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
7ec0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
7ed0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
7ee0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
7ef0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
7f00: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
7f10: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
7f20: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
7f30: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7f40: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
7f50: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7f60: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7f70: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
7f80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
7f90: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
7fa0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7fb0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7fc0: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7fd0: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7fe0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7ff0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
8000: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8010: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
8020: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
8030: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8040: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8050: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8060: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8070: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8080: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
8090: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
80a0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
80b0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
80c0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
80d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
80e0: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
80f0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8100: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8110: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
8120: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
8130: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
8140: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
8150: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
8160: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
8170: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
8180: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
8190: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
81a0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
81b0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
81c0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
81d0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
81e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
81f0: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
8200: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
8210: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8220: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8230: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8240: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8250: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
8260: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
8270: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
8280: 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ol[i];.  sqlite3
8290: 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  _free(pCol->zTyp
82a0: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  e);.  pCol->zTyp
82b0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
82c0: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
82d0: 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70  >db, pType);.  p
82e0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
82f0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8300: 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ype(pType);.}../
8310: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
8320: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
8330: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
8340: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8350: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
8360: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
8370: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8380: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
8390: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
83a0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
83b0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
83c0: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
83d0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
83e0: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
83f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8400: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
8410: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
8420: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8430: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
8440: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8450: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8460: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
8470: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8480: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8490: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
84a0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
84b0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
84c0: 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20  ewTable)!=0 ){. 
84d0: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
84e0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
84f0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
8500: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
8510: 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29  rFunction(pExpr)
8520: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8530: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8540: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
8550: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
8560: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
8570: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
8580: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
8590: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
85a0: 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 73 71  *pCopy;.      sq
85b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
85c0: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 73 71  se->db;.      sq
85d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
85e0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
85f0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8600: 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65  = pCopy = sqlite
8610: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
8620: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
8630: 43 6f 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Copy ){.        
8640: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
8650: 28 64 62 2c 20 26 70 43 6f 70 79 2d 3e 73 70 61  (db, &pCopy->spa
8660: 6e 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  n, &pExpr->span)
8670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8680: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
8690: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a  rDelete(pExpr);.
86a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
86b0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
86c0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
86d0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
86e0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
86f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
8700: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
8710: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
8720: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
8730: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
8740: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
8750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
8760: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8770: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
8780: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
8790: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
87a0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
87b0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
87c0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
87d0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
87e0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
87f0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
8800: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
8810: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
8820: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
8830: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
8840: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
8850: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
8860: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
8870: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
8880: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
8890: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
88a0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
88b0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
88c0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
88d0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
88e0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
88f0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
8900: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
8910: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
8920: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
8930: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
8940: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
8950: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
8960: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
8970: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
8980: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
8990: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
89a0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
89b0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
89c0: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
89d0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
89e0: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
89f0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
8a00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8a10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8a20: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
8a30: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
8a40: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
8a50: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
8a60: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
8a70: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
8a80: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
8a90: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
8aa0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
8ab0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
8ac0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
8ad0: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
8ae0: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
8af0: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
8b00: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
8b10: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8b20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8b30: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
8b40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
8b50: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
8b60: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
8b70: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
8b80: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
8b90: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
8ba0: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
8bb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8bc0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
8bd0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
8be0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
8bf0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
8c00: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
8c10: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8c20: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
8c30: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
8c40: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
8c50: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
8c60: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
8c70: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
8c80: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
8c90: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
8ca0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
8cb0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8cc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  .      for(iCol=
8cd0: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
8ce0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
8cf0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8d00: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
8d10: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
8d20: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8d30: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8d50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8d60: 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d    if( iCol<pTab-
8d70: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
8d80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8d90: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
8da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8db0: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45     if( pList->nE
8dc0: 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d  xpr>1 ) iCol = -
8dd0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  1;.  }.  if( iCo
8de0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8df0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  b->nCol ){.    z
8e00: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
8e10: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
8e20: 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26   }.  if( zType &
8e30: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8e40: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
8e50: 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  ")==0.        &&
8e60: 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49   sortOrder==SQLI
8e70: 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20  TE_SO_ASC ){.   
8e80: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
8e90: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
8ea0: 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72  eyConf = onError
8eb0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f  ;.    pTab->auto
8ec0: 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20  Inc = autoInc;. 
8ed0: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
8ee0: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
8ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
8f00: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
8f10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8f20: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
8f30: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
8f40: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
8f50: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
8f60: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
8f70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8f80: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
8f90: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
8fa0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
8fb0: 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65  , 0, 0, sortOrde
8fc0: 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  r, 0);.    pList
8fd0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
8fe0: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
8ff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9000: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
9010: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
9020: 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20  Add a new CHECK 
9030: 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68  constraint to th
9040: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9050: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9060: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9070: 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e  lite3AddCheckCon
9080: 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
9090: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
90a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
90b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63  */.  Expr *pChec
90c0: 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68  kExpr  /* The ch
90d0: 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  eck expression *
90e0: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
9100: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9110: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9120: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9130: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9140: 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f  if( pTab && !IN_
9150: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
9160: 20 20 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b      /* The CHECK
9170: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
9180: 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20 73   be duplicated s
9190: 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65  o that tokens re
91a0: 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  fer.    ** to ma
91b0: 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64  lloced space and
91c0: 20 6e 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65   not the (epheme
91d0: 72 61 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65  ral) text of the
91e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20   CREATE TABLE.  
91f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a    ** statement *
9200: 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65  /.    pTab->pChe
9210: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
9220: 41 6e 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43  And(db, pTab->pC
9230: 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  heck, .         
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9260: 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 68 65  ExprDup(db, pChe
9270: 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65  ckExpr));.  }.#e
9280: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
9290: 70 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45  prDelete(pCheckE
92a0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xpr);.}../*.** S
92b0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
92c0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
92d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
92e0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
92f0: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
9300: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
9310: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9320: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
9330: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9340: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
9350: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
9360: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
9370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
9380: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
9390: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
93a0: 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 20 3d 20   */..  if( (p = 
93b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
93c0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
93d0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
93e0: 0a 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  zColl = sqli
93f0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9400: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 6f  (pParse->db, pTo
9410: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
9420: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
9430: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
9440: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
9450: 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
9460: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
9470: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
9480: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
9490: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
94a0: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
94b0: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
94c0: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
94d0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
94e0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
94f0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
9500: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
9510: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
9520: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
9530: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
9540: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
9550: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
9560: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
9570: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
9580: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
9590: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
95a0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
95b0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
95c0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
95d0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
95e0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
95f0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
9600: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
9610: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9620: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9630: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
9640: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9650: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
9660: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9670: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
9680: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
9690: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
96a0: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
96b0: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
96c0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
96d0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
96e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
96f0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
9700: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
9710: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
9720: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
9730: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
9740: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
9750: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
9760: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
9770: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9780: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
9790: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
97a0: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
97b0: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
97c0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
97d0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
97e0: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
97f0: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
9800: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
9810: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
9820: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
9830: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
9840: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
9850: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
9860: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
9870: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
9880: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
9890: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
98a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
98b0: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
98c0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
98d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
98e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
98f0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
9900: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9910: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
9920: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
9930: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
9940: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
9950: 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c  message..*/.Coll
9960: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
9970: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
9980: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9990: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
99a0: 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  nName){.  sqlite
99b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
99c0: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
99d0: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
99e0: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
99f0: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
9a00: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
9a10: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
9a20: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
9a30: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e  zName, nName, in
9a40: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
9a50: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
9a60: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
9a70: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
9a80: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
9a90: 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c  llSeq(db, pColl,
9aa0: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
9ab0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9ac0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  {.      if( nNam
9ad0: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  e<0 ){.        n
9ae0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
9af0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
9b00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9b10: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
9b20: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
9b30: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
9b40: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  nName, zName);. 
9b50: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a       pColl = 0;.
9b60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9b70: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
9b80: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9b90: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
9ba0: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
9bb0: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
9bc0: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
9bd0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
9be0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
9bf0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
9c00: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
9c10: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
9c20: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
9c30: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
9c40: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
9c50: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
9c60: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
9c70: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
9c80: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
9c90: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
9ca0: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
9cb0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
9cc0: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
9cd0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
9ce0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
9cf0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
9d00: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
9d10: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
9d20: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
9d30: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
9d40: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
9d50: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
9d60: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
9d70: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
9d80: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
9d90: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
9da0: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
9db0: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
9dc0: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
9dd0: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
9de0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
9df0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
9e00: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
9e10: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
9e20: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
9e30: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
9e40: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
9e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
9e60: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  geCookie(sqlite3
9e70: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
9e80: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
9e90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9ea0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
9eb0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
9ec0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
9ed0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
9ee0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9ef0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30  etCookie, iDb, 0
9f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
9f10: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
9f20: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
9f30: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
9f40: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
9f50: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
9f60: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
9f70: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
9f80: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
9f90: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
9fa0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
9fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
9fc0: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
9fd0: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
9fe0: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
9ff0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
a000: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a010: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
a020: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
a030: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
a040: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
a050: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
a060: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
a070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
a080: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   2;.}../*.** Wri
a090: 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  te an identifier
a0a0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
a0b0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
a0c0: 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65  g.  Add.** quote
a0d0: 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20 6e   characters as n
a0e0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a0f0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
a100: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
a110: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
a120: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
a130: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
a140: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
a150: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
a160: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
a170: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
a180: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
a190: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a1a0: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
a1b0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a1c0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a1d0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a1e0: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
a1f0: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
a200: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
a220: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
a230: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
a240: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
a250: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
a260: 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d   = '"';.  for(j=
a270: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
a280: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
a290: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
a2a0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
a2b0: 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  "' ) z[i++] = '"
a2c0: 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65  ';.  }.  if( nee
a2d0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
a2e0: 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20  = '"';.  z[i] = 
a2f0: 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a  0;.  *pIdx = i;.
a300: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a310: 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  e a CREATE TABLE
a320: 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f   statement appro
a330: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
a340: 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  iven.** table.  
a350: 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  Memory to hold t
a360: 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
a370: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61  tatement is obta
a380: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a390: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
a3a0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
a3b0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
a3c0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
a3d0: 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62   char *createTab
a3e0: 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c  leStmt(Table *p,
a3f0: 20 69 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20   int isTemp){.  
a400: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
a410: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
a420: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
a430: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
a440: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
a450: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
a460: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
a470: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a480: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
a490: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a4a0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a4b0: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
a4c0: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
a4d0: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
a4e0: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
a4f0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
a500: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
a510: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
a520: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
a530: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
a540: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
a550: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
a560: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
a570: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
a580: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
a590: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
a5a0: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
a5b0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
a5c0: 5f 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  _malloc( n );.  
a5d0: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72  if( zStmt==0 ) r
a5e0: 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
a5f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
a600: 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Stmt,.          
a610: 20 20 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45          !OMIT_TE
a620: 4d 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22  MPDB&&isTemp ? "
a630: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
a640: 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c  E ":"CREATE TABL
a650: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
a660: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
a670: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a680: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
a690: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
a6a0: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
a6b0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a6c0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a6d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
a6e0: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
a6f0: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
a700: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
a710: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
a720: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
a730: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
a740: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
a750: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
a760: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
a770: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
a780: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
a790: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
a7a0: 29 2b 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20  )+k+1<=n );.    
a7b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a7c0: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
a7d0: 5d 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ], "%s", z);.   
a7e0: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a     k += strlen(z
a7f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a800: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a810: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
a820: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
a830: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
a840: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a850: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
a860: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
a870: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
a880: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
a890: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
a8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
a8b0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a8c0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
a8d0: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
a8e0: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
a8f0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
a900: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
a910: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
a920: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
a930: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
a940: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
a950: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
a960: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
a970: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
a980: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
a990: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
a9a0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a9b0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
a9c0: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
a9d0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
a9e0: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
a9f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
aa00: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
aa10: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
aa20: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
aa30: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
aa40: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
aa50: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
aa60: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
aa70: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
aa80: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
aa90: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
aaa0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
aab0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
aac0: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
aad0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
aae0: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
aaf0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
ab00: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
ab10: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
ab20: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
ab30: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
ab40: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
ab50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
ab60: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
ab70: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
ab80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ab90: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
aba0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
abb0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
abc0: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
abd0: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
abe0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
abf0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ac00: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
ac10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
ac20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ac30: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
ac40: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
ac50: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
ac60: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
ac70: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
ac80: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
ac90: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
aca0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
acb0: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
acc0: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
acd0: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
ace0: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
acf0: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
ad00: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
ad10: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
ad20: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
ad30: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
ad40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
ad50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ad60: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
ad70: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
ad80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
ad90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ada0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
adb0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
adc0: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
add0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
ade0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
adf0: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
ae00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ae10: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
ae20: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
ae30: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
ae40: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
ae50: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
ae60: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
ae70: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
ae80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
ae90: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
aea0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
aeb0: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
aec0: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
aed0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
aee0: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
aef0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
af00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
af10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
af20: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
af30: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
af40: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
af50: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
af60: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
af70: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
af80: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
af90: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
afa0: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
afb0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
afc0: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
afd0: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
afe0: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
aff0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
b000: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
b010: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b020: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
b030: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b040: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b050: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b060: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
b070: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b080: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
b090: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b0a0: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
b0b0: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
b0c0: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
b0d0: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
b0e0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
b0f0: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
b100: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
b110: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
b120: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
b130: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
b140: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
b150: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
b160: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
b170: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
b180: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
b190: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
b1a0: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
b1b0: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
b1c0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
b1d0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
b1e0: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
b1f0: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
b200: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
b210: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
b220: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
b230: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
b240: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
b250: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
b260: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
b270: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
b280: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
b290: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
b2a0: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
b2b0: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
b2c0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
b2d0: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
b2e0: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
b2f0: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
b300: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
b310: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
b320: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
b330: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
b340: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
b350: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
b360: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
b370: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
b380: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
b390: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
b3a0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
b3b0: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
b3c0: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
b3d0: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
b3e0: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
b3f0: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
b400: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
b410: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
b420: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b430: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
b440: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
b450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b460: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
b470: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20   0, 0);..    /* 
b480: 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
b490: 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  age for the new 
b4a0: 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69  table and push i
b4b0: 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
b4c0: 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20  ..    ** A view 
b4d0: 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c  has no rootpage,
b4e0: 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20   so just push a 
b4f0: 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74  zero onto the st
b500: 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76  ack for.    ** v
b510: 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a  iews.  Initializ
b520: 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20 73  e zType at the s
b530: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f  ame time..    */
b540: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
b550: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
b560: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
b570: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
b580: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
b590: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
b5a0: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
b5b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
b5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
b5d0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
b5e0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
b5f0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
b600: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
b610: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
b620: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
b630: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
b640: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
b650: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
b660: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
b670: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
b680: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
b690: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
b6a0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
b6b0: 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65   table is on the
b6c0: 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65   top of the vdbe
b6d0: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20   stack..    **. 
b6e0: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
b6f0: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
b700: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
b710: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
b720: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
b730: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
b740: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
b750: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
b760: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
b770: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
b780: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
b790: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
b7a0: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
b7b0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
b7c0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
b7d0: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
b7e0: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
b7f0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
b800: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
b810: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
b820: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
b830: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
b840: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
b850: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
b860: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
b870: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
b880: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
b890: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
b8a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
b8b0: 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  elTab;.      sql
b8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b8d0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
b8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
b900: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
b910: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b920: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
b930: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
b940: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
b950: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
b960: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
b970: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
b980: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
b990: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b9a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b9b0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
b9c0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
b9d0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
b9e0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
b9f0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ba00: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
ba10: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
ba20: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
ba30: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
ba40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ba50: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
ba60: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
ba70: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
ba80: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
ba90: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
baa0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
bab0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
bac0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
bad0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
bae0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
baf0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
bb00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
bb10: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
bb20: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
bb30: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
bb40: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
bb50: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
bb60: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
bb70: 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68  eStmt(p, p->pSch
bb80: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
bb90: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 65  pSchema);.    }e
bba0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70  lse{.      n = p
bbb0: 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  End->z - pParse-
bbc0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20  >sNameToken.z + 
bbd0: 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  1;.      zStmt =
bbe0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
bbf0: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
bc00: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
bc10: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
bc20: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
bc30: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
bc40: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
bc50: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
bc60: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
bc70: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
bc80: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
bc90: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
bca0: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
bcb0: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
bcc0: 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
bcd0: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
bce0: 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20  e've collected. 
bcf0: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
bd00: 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a  he preallocated.
bd10: 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74      ** slot is t
bd20: 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74  he 2nd item on t
bd30: 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74  he stack.  The t
bd40: 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  op of the stack 
bd50: 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  is the.    ** ro
bd60: 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  ot page for the 
bd70: 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20  new table (or a 
bd80: 30 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76  0 if this is a v
bd90: 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iew)..    */.   
bda0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
bdb0: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
bdc0: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
bdd0: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
bde0: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
bdf0: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
be00: 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71   rootpage=#0, sq
be10: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
be20: 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a  HERE rowid=#1",.
be30: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
be40: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
be50: 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
be60: 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
be70: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
be80: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
be90: 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
bea0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
beb0: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
bec0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
bed0: 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , v, iDb);..#ifn
bee0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bef0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
bf00: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
bf10: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
bf20: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
bf30: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
bf40: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
bf50: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
bf60: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
bf70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bf80: 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20  ->autoInc ){.   
bf90: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
bfa0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
bfb0: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
bfc0: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
bfd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bfe0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
bff0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
c000: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
c010: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
c020: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
c030: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
c040: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c050: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c060: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
c070: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
c080: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
c090: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
c0a0: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
c0b0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
c0c0: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
c0d0: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
c0e0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
c0f0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
c100: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
c110: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
c120: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
c130: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
c140: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
c150: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
c160: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c170: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
c180: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
c190: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
c1a0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
c1b0: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
c1c0: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
c1d0: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
c1e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c1f0: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
c200: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
c210: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
c220: 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  1,p);.    if( pO
c230: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
c240: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
c250: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
c260: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
c270: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
c280: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
c290: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
c2a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c2b0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c2c0: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
c2d0: 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d  Y.    for(pFKey=
c2e0: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  p->pFKey; pFKey;
c2f0: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
c300: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
c310: 76 6f 69 64 20 2a 64 61 74 61 3b 0a 20 20 20 20  void *data;.    
c320: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
c330: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
c340: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
c350: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
c360: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
c370: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  ema->aFKey, pFKe
c380: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
c390: 20 20 20 20 64 61 74 61 20 3d 20 73 71 6c 69 74      data = sqlit
c3a0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
c3b0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
c3c0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
c3d0: 46 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  FKey);.      if(
c3e0: 20 64 61 74 61 3d 3d 28 76 6f 69 64 20 2a 29 70   data==(void *)p
c3f0: 46 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  FKey ){.        
c400: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c410: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
c420: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
c430: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
c440: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
c450: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
c460: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c470: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
c480: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c490: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
c4a0: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
c4b0: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
c4c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
c4d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
c4e0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
c4f0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
c500: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
c510: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
c520: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
c530: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
c540: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
c550: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
c560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
c570: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
c580: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
c590: 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ame;.      p->ad
c5a0: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
c5b0: 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
c5c0: 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
c5d0: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
c5e0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
c5f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
c610: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
c620: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
c630: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
c640: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
c650: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
c660: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c670: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
c680: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
c690: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
c6a0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
c6b0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
c6c0: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
c6d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
c6e0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
c6f0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
c700: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c710: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
c720: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
c730: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
c740: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
c750: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
c760: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
c770: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
c780: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
c790: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
c7a0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
c7b0: 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
c7c0: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
c7d0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
c7e0: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
c7f0: 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
c800: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
c810: 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
c820: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
c830: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
c840: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
c850: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
c860: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
c870: 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
c880: 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44  *pName;.  int iD
c890: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
c8a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
c8b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
c8c0: 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
c8d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c8e0: 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
c8f0: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
c900: 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
c910: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c920: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c930: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c940: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
c950: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
c960: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
c970: 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
c980: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
c990: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
c9a0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
c9b0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
c9c0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c9d0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
c9e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
c9f0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
ca00: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
ca10: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
ca20: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ca30: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
ca40: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
ca50: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
ca60: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
ca70: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
ca80: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
ca90: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
caa0: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
cab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
cac0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
cad0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
cae0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
caf0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
cb00: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
cb10: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
cb20: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
cb30: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
cb40: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
cb50: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
cb60: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
cb70: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
cb80: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
cb90: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
cba0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
cbb0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
cbc0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
cbd0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
cbe0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
cbf0: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
cc00: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
cc10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
cc20: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  p(db, pSelect);.
cc30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
cc40: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
cc50: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
cc60: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
cc70: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
cc80: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
cc90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
cca0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
ccb0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
ccc0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
ccd0: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
cce0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
ccf0: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
cd00: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
cd10: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
cd20: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
cd30: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
cd40: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
cd50: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
cd60: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
cd70: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
cd80: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e  n = 0;.  n = sEn
cd90: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b  d.z - pBegin->z;
cda0: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e  .  z = (const un
cdb0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65  signed char*)pBe
cdc0: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
cdd0: 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d   n>0 && (z[n-1]=
cde0: 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28  =';' || isspace(
cdf0: 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b  z[n-1])) ){ n--;
ce00: 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
ce10: 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
ce20: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
ce30: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
ce40: 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
ce50: 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
ce60: 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
ce70: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
ce80: 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
ce90: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
cea0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ceb0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
cec0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
ced0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
cee0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
cef0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
cf00: 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
cf10: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
cf20: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
cf30: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
cf40: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
cf50: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
cf60: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
cf70: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
cf80: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
cf90: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
cfa0: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
cfb0: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
cfc0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
cfd0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
cfe0: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
cff0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d000: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
d010: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d020: 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
d030: 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
d040: 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
d050: 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
d060: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
d070: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
d080: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
d090: 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
d0a0: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
d0b0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
d0c0: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
d0d0: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
d0e0: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
d0f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
d100: 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
d110: 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
d120: 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
d130: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
d140: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d150: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
d160: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
d170: 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  loc errors */.  
d180: 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69  int (*xAuth)(voi
d190: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
d1a0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
d1b0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d1c0: 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65   char*);..  asse
d1d0: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
d1e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d1f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d200: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
d210: 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
d220: 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
d230: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d240: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
d250: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
d260: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
d270: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
d280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
d290: 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
d2a0: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
d2b0: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
d2c0: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
d2d0: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
d2e0: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
d2f0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
d300: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
d310: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
d320: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
d330: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
d340: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
d350: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
d360: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
d370: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
d380: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
d390: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
d3a0: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
d3b0: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
d3c0: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
d3d0: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
d3e0: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
d3f0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
d400: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
d410: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
d420: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
d430: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
d440: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
d450: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
d460: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
d470: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
d480: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
d490: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
d4a0: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
d4b0: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
d4c0: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
d4d0: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
d4e0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
d4f0: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
d500: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d510: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
d520: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
d530: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
d540: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
d550: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
d560: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
d570: 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
d580: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
d590: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
d5a0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
d5b0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
d5c0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
d5d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d5e0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
d5f0: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
d600: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
d610: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
d620: 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
d630: 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
d640: 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
d650: 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
d660: 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
d670: 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
d680: 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
d690: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
d6a0: 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
d6b0: 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
d6c0: 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
d6d0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
d6e0: 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
d6f0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d700: 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
d710: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
d720: 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
d730: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d740: 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
d750: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
d760: 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20  pSel ){.    n = 
d770: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
d780: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
d790: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
d7a0: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
d7b0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
d7c0: 43 6f 6c 20 3d 20 2d 31 3b 0a 23 69 66 6e 64 65  Col = -1;.#ifnde
d7d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
d7e0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
d7f0: 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
d800: 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  h;.    db->xAuth
d810: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
d820: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
d830: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
d840: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
d850: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
d860: 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
d870: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
d880: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
d890: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
d8a0: 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
d8b0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
d8c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
d8d0: 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
d8e0: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
d8f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
d900: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
d910: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
d920: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
d930: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
d940: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
d950: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
d960: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
d970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
d980: 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62  eteTable(pSelTab
d990: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
d9a0: 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20  >pSchema->flags 
d9b0: 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
d9c0: 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
d9d0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
d9e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
d9f0: 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
da00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
da10: 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c  te(pSel);.  } el
da20: 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
da30: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
da40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
da50: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
da60: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
da70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
da80: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
da90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
daa0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
dab0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
dac0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
dad0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
dae0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
daf0: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
db00: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
db10: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
db20: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
db30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
db40: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
db50: 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73  *i;.  if( !DbHas
db60: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
db70: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
db80: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
db90: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
dba0: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
dbb0: 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
dbc0: 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
dbd0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
dbe0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
dbf0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
dc00: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
dc10: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
dc20: 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c    sqliteResetCol
dc30: 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a  umnNames(pTab);.
dc40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
dc50: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
dc60: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
dc70: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
dc80: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
dc90: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
dca0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
dcb0: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
dcc0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
dcd0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
dce0: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
dcf0: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
dd00: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
dd10: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
dd20: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
dd30: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
dd40: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
dd50: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
dd60: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
dd70: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
dd80: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
dd90: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
dda0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
ddb0: 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
ddc0: 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
ddd0: 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
dde0: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
ddf0: 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
de00: 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
de10: 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
de20: 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
de30: 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
de40: 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
de50: 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
de60: 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
de70: 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
de80: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
de90: 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
dea0: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
deb0: 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
dec0: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
ded0: 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
dee0: 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
def0: 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
df00: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
df10: 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
df20: 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
df30: 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
df40: 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
df50: 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
df60: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
df70: 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
df80: 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
df90: 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
dfa0: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
dfb0: 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
dfc0: 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
dfd0: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
dfe0: 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
dff0: 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
e000: 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
e010: 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
e020: 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
e030: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e040: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
e050: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
e060: 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62  ageMoved(Db *pDb
e070: 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
e080: 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
e090: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
e0a0: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73   *pHash;..  pHas
e0b0: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
e0c0: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f  a->tblHash;.  fo
e0d0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
e0e0: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
e0f0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
e100: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
e110: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
e120: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
e130: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
e140: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
e150: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
e160: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
e170: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  o;.    }.  }.  p
e180: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
e190: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
e1a0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
e1b0: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
e1c0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
e1d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
e1e0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
e1f0: 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
e200: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
e210: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74  .    if( pIdx->t
e220: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
e230: 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d      pIdx->tnum =
e240: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
e250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
e260: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
e270: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
e280: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
e290: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
e2a0: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
e2b0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
e2c0: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
e2d0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
e2e0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
e2f0: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
e300: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
e310: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
e320: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
e330: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
e340: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
e350: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
e360: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
e370: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
e380: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
e390: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
e3a0: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
e3b0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
e3c0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
e3d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e3e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e3f0: 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
e400: 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29 3b  y, iTable, iDb);
e410: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e420: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e430: 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
e440: 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67 65  pushes an intege
e450: 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
e460: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
e470: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
e480: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
e490: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
e4a0: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
e4b0: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
e4c0: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
e4d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
e4e0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
e4f0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e500: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
e510: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
e520: 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74 68  * The "#0" in th
e530: 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
e540: 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
e550: 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
e560: 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e  value.  ** is on
e570: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
e580: 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c 69  stack.  See sqli
e590: 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28  te3RegisterExpr(
e5a0: 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  )..  */.  sqlite
e5b0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
e5c0: 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
e5d0: 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
e5e0: 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
e5f0: 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  0 AND rootpage=#
e600: 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  0",.     pParse-
e610: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
e620: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
e630: 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29 3b  E(iDb), iTable);
e640: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e650: 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
e660: 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
e670: 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
e680: 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
e690: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
e6a0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
e6b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e6c0: 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
e6d0: 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
e6e0: 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
e6f0: 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
e700: 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
e710: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
e720: 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
e730: 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
e740: 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
e750: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
e760: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
e770: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
e780: 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
e790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
e7a0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
e7b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e7c0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
e7d0: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
e7e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
e7f0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
e800: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
e810: 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
e820: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
e830: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
e840: 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
e850: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e860: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e870: 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
e880: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
e890: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
e8a0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
e8b0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
e8c0: 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
e8d0: 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
e8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e8f0: 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
e900: 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
e910: 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
e920: 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
e930: 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
e940: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
e950: 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
e960: 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
e970: 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
e980: 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
e990: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
e9a0: 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
e9b0: 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
e9c0: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
e9d0: 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
e9e0: 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
e9f0: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
ea00: 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
ea10: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
ea20: 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
ea30: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
ea40: 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
ea50: 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
ea60: 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
ea70: 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
ea80: 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
ea90: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
eaa0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
eab0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
eac0: 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
ead0: 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
eae0: 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
eaf0: 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
eb00: 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
eb10: 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
eb20: 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
eb30: 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
eb40: 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
eb50: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
eb60: 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
eb70: 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
eb80: 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
eb90: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
eba0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
ebb0: 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
ebc0: 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
ebd0: 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
ebe0: 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
ebf0: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
ec00: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
ec10: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ec20: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
ec30: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
ec40: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
ec50: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
ec60: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
ec70: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
ec80: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
ec90: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
eca0: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
ecb0: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
ecc0: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
ecd0: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
ece0: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
ecf0: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
ed00: 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
ed10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
ed20: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
ed30: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
ed40: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
ed50: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
ed60: 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f  a);.      destro
ed70: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
ed80: 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
ed90: 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
eda0: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
edb0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
edc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
edd0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
ede0: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
edf0: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
ee00: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
ee10: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
ee20: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
ee30: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
ee40: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
ee50: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
ee60: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
ee70: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
ee80: 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
ee90: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
eea0: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
eeb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
eec0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
eed0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
eee0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
eef0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
ef00: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ef10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ef20: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
ef30: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
ef40: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
ef50: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
ef60: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
ef70: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
ef80: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
ef90: 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
efa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
efb0: 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73  ErrorClear(pPars
efc0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  e);.    }.    go
efd0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
efe0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
eff0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
f000: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
f010: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
f020: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
f030: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
f040: 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
f050: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
f060: 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
f070: 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
f080: 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
f090: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
f0a0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
f0b0: 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
f0c0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
f0d0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
f0e0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
f0f0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f100: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f110: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
f120: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
f130: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
f140: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
f150: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
f160: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f170: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
f180: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
f190: 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
f1a0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
f1b0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f1c0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
f1d0: 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
f1e0: 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
f1f0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f200: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
f210: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
f220: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
f230: 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
f240: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f250: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
f260: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f270: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f280: 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
f290: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
f2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
f2b0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
f2c0: 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
f2d0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
f2e0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f2f0: 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
f300: 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e 70   zArg2 = pTab->p
f310: 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64  Mod->zName;.#end
f320: 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
f330: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
f340: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
f350: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
f360: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
f370: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
f380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
f390: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
f3a0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
f3b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
f3c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
f3d0: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61  Parse, code, pTa
f3e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c  b->zName, zArg2,
f3f0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f400: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f410: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
f420: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f430: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f440: 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d  TE_DELETE, pTab-
f450: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
f460: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
f470: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f480: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f490: 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
f4a0: 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62  Only || pTab==db
f4b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
f4c0: 6d 61 2d 3e 70 53 65 71 54 61 62 20 29 7b 0a 20  ma->pSeqTab ){. 
f4d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f4e0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
f4f0: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
f500: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
f510: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
f520: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f530: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
f540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
f550: 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
f560: 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
f570: 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
f580: 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
f590: 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
f5a0: 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
f5b0: 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
f5c0: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
f5d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f5e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
f5f0: 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
f600: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
f610: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
f620: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
f630: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
f640: 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
f650: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
f660: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f670: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
f680: 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
f690: 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
f6a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f6b0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f6c0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
f6d0: 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
f6e0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
f6f0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
f700: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
f710: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
f720: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
f730: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f740: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
f750: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
f760: 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  er;.    Db *pDb 
f770: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
f780: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
f790: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
f7a0: 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
f7b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f7c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f7d0: 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
f7e0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
f7f0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
f800: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f810: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
f820: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  v ){.        sql
f830: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f840: 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30   OP_VBegin, 0, 0
f850: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f860: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
f870: 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
f880: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
f890: 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
f8a0: 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
f8b0: 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61      ** is genera
f8c0: 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
f8d0: 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
f8e0: 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
f8f0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65      ** sqlite_te
f900: 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
f910: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
f920: 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61    pTrigger = pTa
f930: 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20  b->pTrigger;.   
f940: 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
f950: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f960: 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
f970: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
f980: 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ma || .         
f990: 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
f9a0: 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
f9b0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
f9c0: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
f9d0: 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
f9e0: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70  rigger);.      p
f9f0: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
fa00: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
fa10: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fa20: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
fa30: 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  ENT.    /* Remov
fa40: 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
fa50: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
fa60: 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
fa70: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
fa80: 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
fa90: 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
faa0: 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
fab0: 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
fac0: 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68  ped.    ** at th
fad0: 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
fae0: 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
faf0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
fb00: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
fb10: 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
fb20: 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
fb30: 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
fb40: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
fb50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fb60: 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a  Tab->autoInc ){.
fb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
fb80: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
fb90: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
fba0: 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f   FROM %s.sqlite_
fbb0: 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e  sequence WHERE n
fbc0: 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
fbd0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
fbe0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
fbf0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
fc00: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
fc10: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
fc20: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
fc30: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
fc40: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   to the.    ** t
fc50: 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
fc60: 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
fc70: 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
fc80: 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
fc90: 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  s.    ** every r
fca0: 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
fcb0: 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
fcc0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
fcd0: 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20  e one being.    
fce0: 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
fcf0: 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
fd00: 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61   seperately beca
fd10: 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
fd20: 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  n be.    ** crea
fd30: 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
fd40: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
fd50: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
fd60: 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  in another.    *
fd70: 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
fd80: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
fd90: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
fda0: 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  , .        "DELE
fdb0: 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
fdc0: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
fdd0: 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
fde0: 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44  er'",.        pD
fdf0: 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
fe00: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
fe10: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
fe20: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
fe30: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
fe40: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
fe50: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
fe60: 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
fe70: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
fe80: 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
fe90: 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
fea0: 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
feb0: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
fec0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
fed0: 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  */.    if( IsVir
fee0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
fef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
ff00: 70 33 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p3(v, OP_VDestro
ff10: 79 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d  y, iDb, 0, pTab-
ff20: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
ff30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
ff40: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
ff50: 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54  able, iDb, 0, pT
ff60: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
ff70: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
ff80: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44  Cookie(db, v, iD
ff90: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
ffa0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
ffb0: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
ffc0: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
ffd0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
ffe0: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
fff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10000 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
10010 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
10020 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
10030 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
10040 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10050 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
10060 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
10070 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
10080 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
10090 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
100a0 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
100b0 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
100c0 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
100d0 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
100e0 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
100f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
10100 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
10110 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
10120 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
10130 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
10140 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
10150 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
10160 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
10170 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
10180 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
10190 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
101a0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
101b0 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
101c0 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
101d0 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
101e0 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
101f0 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
10200 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
10210 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
10220 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
10230 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
10240 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
10250 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
10260 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
10270 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
10280 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
10290 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
102a0 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
102b0 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
102c0 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
102d0 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
102e0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
102f0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
10300 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
10310 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
10320 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
10330 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
10340 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
10350 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
10360 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
10370 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
10380 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
10390 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
103a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
103b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
103c0 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
103d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
103e0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
103f0 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
10400 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
10410 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
10420 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
10430 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
10440 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
10450 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
10460 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
10470 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
10480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10490 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
104a0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
104b0 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
104c0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
104d0 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
104e0 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  ey = 0;.  Table 
104f0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
10500 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
10510 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
10520 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
10530 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
10540 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
10550 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
10560 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  nErr || IN_DECLA
10570 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
10580 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
10590 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
105a0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
105b0 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43  ol-1;.    if( iC
105c0 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  ol<0 ) goto fk_e
105d0 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
105e0 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
105f0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
10600 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10610 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
10620 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
10630 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
10640 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
10650 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
10660 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
10670 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
10680 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
10690 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
106a0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
106b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
106c0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
106d0 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
106e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
106f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10700 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
10710 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10720 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
10730 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
10740 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
10750 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
10760 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
10770 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
10780 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
10790 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
107a0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
107b0 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
107c0 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e  zeof(*pFKey) + n
107d0 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  Col*sizeof(pFKey
107e0 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
107f0 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
10800 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
10810 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
10820 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10830 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c     nByte += strl
10840 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  en(pToCol->a[i].
10850 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
10860 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
10870 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
10880 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
10890 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
108a0 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
108b0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
108c0 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
108d0 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
108e0 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
108f0 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
10900 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
10910 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
10920 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
10930 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
10940 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
10950 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
10960 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
10970 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
10980 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
10990 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
109a0 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
109b0 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
109c0 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
109d0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
109e0 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
109f0 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
10a00 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
10a10 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
10a20 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
10a30 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
10a40 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
10a50 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
10a60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
10a70 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
10a80 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
10a90 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
10aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10ab0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
10ac0 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
10ad0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10ae0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10af0 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
10b00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10b10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10b20 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
10b30 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
10b40 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
10b50 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
10b60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
10b70 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
10b80 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
10b90 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
10ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10bb0 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
10bc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
10bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
10be0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f  n = strlen(pToCo
10bf0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
10c00 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
10c10 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
10c20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
10c30 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
10c40 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
10c50 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
10c60 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
10c70 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
10c80 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
10c90 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
10ca0 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20  flags & 0xff;.  
10cb0 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
10cc0 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20  f = (flags >> 8 
10cd0 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  ) & 0xff;.  pFKe
10ce0 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
10cf0 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
10d00 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e   0xff;..  /* Lin
10d10 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
10d20 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
10d30 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
10d40 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
10d50 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
10d60 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
10d70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10d80 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  FKey);.#endif /*
10d90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10da0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
10db0 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  Y) */.  sqlite3E
10dc0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46  xprListDelete(pF
10dd0 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
10de0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
10df0 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (pToCol);.}../*.
10e00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10e10 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
10e20 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
10e30 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
10e40 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
10e50 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
10e60 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
10e70 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
10e80 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
10e90 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
10ea0 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
10eb0 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
10ec0 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
10ed0 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
10ee0 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
10ef0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
10f00 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
10f10 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
10f20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
10f30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
10f40 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
10f50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
10f60 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
10f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f80 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
10f90 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
10fa0 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
10fb0 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
10fc0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
10fd0 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
10fe0 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
10ff0 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e  eturn;.  pFKey->
11000 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44  isDeferred = isD
11010 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
11020 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
11030 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
11040 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
11050 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
11060 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
11070 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
11080 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
11090 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
110a0 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
110b0 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
110c0 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
110d0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
110e0 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
110f0 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
11100 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
11110 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
11120 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
11130 65 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  ed.  The memory 
11140 63 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62  cell specified b
11150 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
11160 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
11170 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
11180 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
11190 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
111a0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
111b0 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
111c0 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
111d0 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
111e0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
111f0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
11200 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
11210 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
11220 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
11230 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
11240 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
11250 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
11260 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
11270 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
11280 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
11290 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
112a0 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
112b0 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
112c0 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
112d0 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
112e0 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  ->nTab;       /*
112f0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
11300 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
11310 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
11320 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20  se->nTab+1;     
11330 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
11340 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
11350 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11380 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
11390 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
113c0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
113d0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
113e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
113f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
11400 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
11410 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
11420 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
11430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
11440 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
11450 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11460 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
11470 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11480 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
11490 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
114a0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
114b0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
114c0 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
114d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
114e0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
114f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11500 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11510 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
11520 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
11530 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11540 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
11550 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
11560 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
11570 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
11580 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
11590 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
115a0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
115b0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
115c0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
115d0 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
115e0 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
115f0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11600 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
11610 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
11620 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
11630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11640 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
11650 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c  ad, memRootPage,
11660 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20   0);.    tnum = 
11670 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11680 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
11690 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
116a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
116b0 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
116c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
116d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
116e0 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
116f0 3b 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  ;.  pKey = sqlit
11700 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
11710 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
11720 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
11730 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
11740 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63  , iIdx, tnum, (c
11750 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b  har *)pKey, P3_K
11760 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
11770 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
11780 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
11790 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
117a0 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
117b0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
117c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
117d0 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
117e0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
117f0 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
11800 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20  x, iTab);.  if( 
11810 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
11820 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
11830 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71  int curaddr = sq
11840 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11850 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74  Addr(v);.    int
11860 20 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72   addr2 = curaddr
11870 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +4;.    sqlite3V
11880 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63  dbeChangeP2(v, c
11890 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29  uraddr-1, addr2)
118a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
118b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
118c0 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  id, iTab, 0);.  
118d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
118e0 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
118f0 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
11900 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11910 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64  OP_IsUnique, iId
11920 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  x, addr2);.    s
11930 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
11940 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
11950 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f  _CONSTRAINT, OE_
11960 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Abort,.         
11970 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65             "inde
11980 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
11990 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
119a0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73  STATIC);.    ass
119b0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
119c0 61 69 6c 65 64 20 7c 7c 20 61 64 64 72 32 3d 3d  ailed || addr2==
119d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
119e0 6e 74 41 64 64 72 28 76 29 20 29 3b 0a 20 20 7d  ntAddr(v) );.  }
119f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11a00 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
11a10 65 72 74 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  ert, iIdx, 0);. 
11a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a30 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
11a40 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
11a50 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11a60 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
11a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a80 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
11a90 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Tab, 0);.  sqlit
11aa0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11ab0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
11ac0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
11ad0 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66  te a new index f
11ae0 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e  or an SQL table.
11af0 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20    pName1.pName2 
11b00 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11b10 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
11b20 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65   pTblList is the
11b30 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
11b40 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
11b50 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
11b60 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
11b70 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
11b80 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
11b90 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
11ba0 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
11bb0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
11bc0 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
11bd0 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
11be0 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
11bf0 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
11c00 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
11c10 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
11c20 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
11c30 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
11c40 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
11c50 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
11c60 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
11c70 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
11c80 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
11c90 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
11ca0 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
11cb0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
11cc0 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
11cd0 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
11ce0 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
11cf0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11d00 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
11d10 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
11d20 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
11d30 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
11d40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
11d50 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
11d60 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
11d70 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
11d80 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
11d90 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
11da0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
11db0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
11dc0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
11dd0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
11de0 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
11df0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
11e00 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
11e10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
11e20 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
11e30 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
11e40 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
11e50 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
11e60 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
11e70 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
11e80 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
11e90 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11ea0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
11eb0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
11ec0 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
11ed0 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
11ee0 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
11ef0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
11f00 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
11f10 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
11f20 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
11f30 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
11f40 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
11f50 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
11f60 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
11f70 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
11f80 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
11f90 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
11fa0 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
11fb0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
11fc0 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
11fd0 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
11fe0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
11ff0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
12000 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
12010 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
12020 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
12030 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
12040 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
12050 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
12060 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
12070 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
12080 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
12090 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
120a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
120b0 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
120c0 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
120d0 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
120e0 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
120f0 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
12100 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
12110 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
12120 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
12130 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
12140 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
12150 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
12160 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
12170 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
12180 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
12190 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
121a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
121b0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
121c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
121d0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
121e0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
121f0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
12200 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
12210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12220 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
12230 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
12240 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
12250 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
12260 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
12270 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
12280 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
12290 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
122a0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
122b0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
122c0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
122d0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
122e0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
122f0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
12300 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  a;..  if( pParse
12310 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
12320 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
12330 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
12340 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
12350 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
12360 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
12370 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
12380 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
12390 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
123a0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
123b0 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
123c0 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
123d0 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
123e0 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
123f0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
12400 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
12410 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
12420 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
12430 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
12440 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
12450 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
12460 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
12470 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
12480 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
12490 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
124a0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
124b0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
124c0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
124d0 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
124e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
124f0 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66  _index;..#ifndef
12500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
12510 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
12520 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
12530 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
12540 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
12550 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
12560 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
12570 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
12580 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
12590 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
125a0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
125b0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
125c0 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
125d0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
125e0 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
125f0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
12600 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
12610 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
12620 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
12630 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
12640 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
12650 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
12660 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
12670 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
12680 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
12690 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
126a0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
126b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
126c0 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
126d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
126e0 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
126f0 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
12700 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
12710 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
12720 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
12730 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
12740 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
12750 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
12760 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
12770 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
12780 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
12790 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
127a0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
127b0 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d  Parse, pTblName-
127c0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  >a[0].zName, .  
127d0 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e        pTblName->
127e0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
127f0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
12800 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12810 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
12820 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
12830 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
12840 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
12850 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
12860 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
12870 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
12880 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
12890 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
128a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
128b0 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
128c0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
128d0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
128e0 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
128f0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
12900 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
12910 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
12920 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
12930 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
12940 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
12950 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12960 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
12970 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
12980 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
12990 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
129a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
129b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
129c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
129d0 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
129e0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
129f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12a00 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
12a10 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
12a20 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
12a30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12a40 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
12a50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12a60 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
12a70 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12a80 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12a90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12aa0 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
12ab0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
12ac0 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
12ad0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12ae0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
12af0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
12b00 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
12b10 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
12b20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
12b30 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
12b40 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
12b50 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
12b60 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
12b70 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
12b80 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
12b90 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
12ba0 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
12bb0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
12bc0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
12bd0 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
12be0 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
12bf0 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
12c00 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
12c10 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
12c20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
12c30 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
12c40 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
12c50 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
12c60 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
12c70 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
12c80 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
12c90 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
12ca0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
12cb0 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
12cc0 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
12cd0 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
12ce0 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
12cf0 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
12d00 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
12d10 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
12d20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
12d30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
12d40 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
12d50 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
12d60 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
12d70 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
12d80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12d90 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a  index;.    if( z
12da0 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
12db0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12dc0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
12dd0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
12de0 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
12df0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
12e00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12e10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12e20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
12e30 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
12e40 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
12e50 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
12e60 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
12e70 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12e80 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73  dex;.      if( s
12e90 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
12ea0 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
12eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12ec0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12ed0 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
12ee0 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
12ef0 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
12f00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
12f10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12f30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
12f40 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
12f50 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
12f60 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
12f70 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
12f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12f90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
12fa0 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
12fb0 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
12fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
12fd0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12fe0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
12ff0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
13000 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
13010 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
13020 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
13030 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
13040 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
13050 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
13060 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 71 6c  , n++){}.    sql
13070 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
13080 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
13090 22 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e  "_%d",n);.    zN
130a0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
130b0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
130c0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75  Name, "sqlite_au
130d0 74 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d  toindex_", pTab-
130e0 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63  >zName, zBuf, (c
130f0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28  har*)0);.    if(
13100 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
13110 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
13120 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
13130 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13140 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
13150 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
13160 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
13170 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
13180 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
13190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
131a0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
131b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
131c0 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a  b = pDb->zName;.
131d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
131e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
131f0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
13200 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
13210 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
13220 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13230 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13240 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
13250 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
13260 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
13270 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
13280 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
13290 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
132a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
132b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
132c0 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
132d0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
132e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
132f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13300 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13310 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
13320 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
13330 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
13340 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
13350 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
13360 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
13370 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
13380 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
13390 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
133a0 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
133b0 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
133c0 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
133d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
133e0 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38    nullId.z = (u8
133f0 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  *)pTab->aCol[pTa
13400 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
13410 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d  ;.    nullId.n =
13420 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e   strlen((char*)n
13430 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
13440 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
13450 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
13460 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49  se, 0, 0, &nullI
13470 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
13480 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
13490 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
134a0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
134b0 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f  ortOrder = sortO
134c0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
134d0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
134e0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
134f0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
13500 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
13510 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
13520 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
13530 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
13540 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
13550 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13560 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
13570 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
13580 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
13590 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e  pExpr ){.      n
135a0 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 74  Extra += (1 + st
135b0 72 6c 65 6e 28 70 45 78 70 72 2d 3e 70 43 6f 6c  rlen(pExpr->pCol
135c0 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  l->zName));.    
135d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
135e0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
135f0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
13600 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
13610 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
13620 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e   nCol = pList->n
13630 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Expr;.  pIndex =
13640 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
13650 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20  Zero(db, .      
13660 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13680 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
13690 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
136a0 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (int)*nCol +    
136b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
136c0 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
136d0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
136e0 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20  (nCol+1) +      
136f0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45   /* Index.aiRowE
13700 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  st   */.      si
13710 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f  zeof(char *)*nCo
13720 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  l +        /* In
13730 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a  dex.azColl     *
13740 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75  /.      sizeof(u
13750 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  8)*nCol +       
13760 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
13770 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ortOrder */.    
13780 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20    nName + 1 +   
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
137a0 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20  * Index.zName   
137b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74     */.      nExt
137c0 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
137d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
137e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
137f0 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  ames */.  );.  i
13800 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
13810 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
13820 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13830 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d  x;.  }.  pIndex-
13840 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
13850 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a  *)(&pIndex[1]);.
13860 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
13870 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49  mn = (int *)(&pI
13880 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  ndex->azColl[nCo
13890 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
138a0 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  iRowEst = (unsig
138b0 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  ned *)(&pIndex->
138c0 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b  aiColumn[nCol]);
138d0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
138e0 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
138f0 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
13900 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e  [nCol+1]);.  pIn
13910 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
13920 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ar *)(&pIndex->a
13930 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29  SortOrder[nCol])
13940 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68  ;.  zExtra = (ch
13950 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a  ar *)(&pIndex->z
13960 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a  Name[nName+1]);.
13970 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
13980 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
13990 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
139a0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
139b0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
139c0 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
139d0 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
139e0 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b  Error = onError;
139f0 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
13a00 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b  ndex = pName==0;
13a10 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
13a20 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
13a30 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a  ].pSchema;..  /*
13a40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
13a50 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
13a60 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
13a70 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
13a80 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
13a90 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
13aa0 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
13ab0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
13ac0 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
13ad0 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
13ae0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
13af0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
13b00 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
13b10 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
13b20 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
13b30 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
13b40 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
13b50 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
13b60 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
13b70 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
13b80 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
13b90 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
13ba0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
13bb0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
13bc0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
13bd0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
13be0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
13bf0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
13c00 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
13c10 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
13c20 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
13c30 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43     Column *pTabC
13c40 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75  ol;.    int requ
13c50 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
13c60 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
13c90 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
13ca0 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ..    for(j=0, p
13cb0 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
13cc0 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
13cd0 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
13ce0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
13cf0 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
13d00 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
13d10 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
13d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13d30 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
13d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13d50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
13d60 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
13d70 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
13d80 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
13d90 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
13da0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13db0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13dc0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f     }.    /* TODO
13dd0 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f  :  Add a test to
13de0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
13df0 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
13e00 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20  is not named.   
13e10 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   ** more than on
13e20 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
13e30 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  me index.  Only 
13e40 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
13e50 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ce of.    ** the
13e60 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
13e70 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
13e80 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
13e90 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
13ea0 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c  .    ** same col
13eb0 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  umn more than on
13ec0 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ce cannot be an 
13ed0 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68  error because th
13ee0 61 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a  at would .    **
13ef0 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
13f00 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
13f10 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
13f20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a  a warning..    *
13f30 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  /.    pIndex->ai
13f40 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
13f50 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
13f60 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->pExpr ){.     
13f70 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74   assert( pListIt
13f80 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
13f90 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20   );.      zColl 
13fa0 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
13fb0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13fc0 28 6e 45 78 74 72 61 2c 20 7a 45 78 74 72 61 2c  (nExtra, zExtra,
13fd0 20 22 25 73 22 2c 20 70 4c 69 73 74 49 74 65 6d   "%s", pListItem
13fe0 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e  ->pExpr->pColl->
13ff0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45  zName);.      zE
14000 78 74 72 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28  xtra += (strlen(
14010 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20  zColl) + 1);.   
14020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
14030 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
14040 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
14050 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
14060 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
14070 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
14080 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
14090 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
140a0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
140b0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
140c0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
140d0 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67  , -1) ){.      g
140e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
140f0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
14100 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
14110 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
14120 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
14130 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
14140 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
14150 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
14160 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
14170 72 5b 69 5d 20 3d 20 72 65 71 75 65 73 74 65 64  r[i] = requested
14180 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
14190 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
141a0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
141b0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
141c0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
141d0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
141e0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
141f0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
14200 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
14210 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
14220 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
14230 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
14240 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
14250 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
14260 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
14270 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14280 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
14290 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
142a0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
142b0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
142c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
142d0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
142e0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
142f0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
14300 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
14310 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
14320 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
14330 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
14340 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
14350 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
14360 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
14370 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
14380 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
14390 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
143a0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
143b0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
143c0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
143d0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
143e0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
143f0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
14400 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
14410 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
14420 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
14430 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
14440 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
14450 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
14460 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14470 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
14480 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
14490 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75  assert( pIdx->au
144a0 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20  toIndex );.     
144b0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
144c0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
144d0 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
144e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70  pIdx->nColumn!=p
144f0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
14500 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14510 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
14520 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b  ->nColumn; k++){
14530 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
14540 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e  har *z1 = pIdx->
14550 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
14560 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14570 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
14580 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
14590 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
145a0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
145b0 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
145c0 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
145d0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
145e0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72  k]!=pIndex->aSor
145f0 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61  tOrder[k] ) brea
14600 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  k;.        if( z
14610 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33  1!=z2 && sqlite3
14620 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
14630 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
14640 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
14650 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
14660 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
14670 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
14680 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
14690 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
146a0 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
146b0 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
146c0 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
146d0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
146e0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
146f0 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
14700 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
14710 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
14720 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
14730 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
14740 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
14750 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
14760 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
14770 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
14780 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
14790 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
147a0 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
147b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
147c0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
147d0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
147e0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
147f0 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
14800 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
14810 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
14820 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
14830 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
14840 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
14850 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
14860 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
14870 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
14880 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
14890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
148a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
148b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148c0 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
148d0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
148e0 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
148f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14900 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14910 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
14920 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
14930 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
14940 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
14950 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
14960 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14970 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14980 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
149a0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
149b0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
149c0 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
149d0 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
149e0 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
149f0 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
14a00 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
14a10 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
14a20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
14a30 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
14a40 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
14a50 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
14a60 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
14a80 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
14a90 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
14aa0 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
14ab0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
14ac0 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
14ad0 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
14ae0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
14af0 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d */.      db->m
14b00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
14b10 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14b20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14b30 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
14b40 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
14b50 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
14b60 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
14b70 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
14b80 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
14b90 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
14ba0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14bb0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
14bc0 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
14bd0 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
14be0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
14bf0 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
14c00 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
14c10 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
14c20 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
14c30 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
14c40 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
14c50 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
14c60 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
14c70 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
14c80 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
14c90 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
14ca0 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
14cb0 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
14cc0 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
14cd0 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
14ce0 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
14cf0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
14d00 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
14d10 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
14d20 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
14d30 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
14d40 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
14d50 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
14d60 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
14d70 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
14d80 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
14d90 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
14da0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
14db0 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
14dc0 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
14dd0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
14de0 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
14df0 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
14e00 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
14e10 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
14e20 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
14e30 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
14e40 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
14e50 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
14e60 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
14e70 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
14e80 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
14e90 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
14ea0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
14eb0 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
14ec0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
14ed0 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
14ee0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
14ef0 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
14f00 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14f10 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
14f20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14f30 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a  _index;...    /*
14f40 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
14f50 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
14f60 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
14f70 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
14f80 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
14f90 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
14fa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14fb0 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
14fc0 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  , iDb, 0);.    s
14fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14fe0 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
14ff0 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  iMem, 0);..    /
15000 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
15010 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
15020 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
15030 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
15040 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
15050 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
15060 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26     if( pStart &&
15070 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f   pEnd ){.      /
15080 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
15090 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
150a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
150b0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
150c0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
150d0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
150e0 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
150f0 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
15100 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
15110 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
15120 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
15130 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
15140 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
15150 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15160 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
15170 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
15180 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
15190 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
151a0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
151b0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
151c0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
151d0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
151e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
151f0 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
15200 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
15210 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
15220 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
15230 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
15240 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
15250 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
15260 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
15270 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c 0a 20 20  ,%Q,#0,%Q);",.  
15280 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
15290 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
152a0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
152b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
152c0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
152d0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
152e0 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
152f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15300 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
15310 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
15320 5f 66 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20  _free(zStmt);.. 
15330 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
15340 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
15350 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
15360 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
15370 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
15380 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
15390 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
153a0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
153b0 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
153c0 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
153d0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
153e0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
153f0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
15400 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
15410 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
15420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
15430 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
15440 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20  ema, iDb, 0,.   
15450 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
15460 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
15470 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
15480 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
15490 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
154a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
154b0 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20  Expire, 0, 0);. 
154c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
154d0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
154e0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
154f0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
15500 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
15510 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
15520 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
15530 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
15540 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
15550 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
15560 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
15570 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
15580 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
15590 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
155a0 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
155b0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
155c0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
155d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
155e0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
155f0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
15600 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
15610 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
15620 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
15630 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
15640 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
15650 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
15660 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
15670 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
15680 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
15690 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
156a0 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
156b0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
156c0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
156d0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
156e0 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
156f0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
15700 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15710 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
15720 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
15730 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
15740 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
15750 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15760 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
15770 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
15780 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
15790 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
157a0 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
157b0 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
157c0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
157d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
157e0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
157f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
15800 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
15810 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
15820 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
15830 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15840 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73  e code to make s
15850 75 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ure the file for
15860 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74  mat number is at
15870 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74   least minFormat
15880 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74  ..** The generat
15890 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63  ed code will inc
158a0 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66  rease the file f
158b0 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20  ormat number if 
158c0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f  necessary..*/.vo
158d0 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75  id sqlite3Minimu
158e0 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73  mFileFormat(Pars
158f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
15900 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61  Db, int minForma
15910 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  t){.  Vdbe *v;. 
15920 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15930 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15940 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
15950 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15960 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
15970 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 1);.    sqli
15980 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
15990 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
159a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
159b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69  , OP_Integer, mi
159c0 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  nFormat, 0);.   
159d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
159e0 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73  p(v, OP_Ge, 0, s
159f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15a00 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
15a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a20 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
15a30 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a   minFormat, 0);.
15a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15a50 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
15a60 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
15a70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c   }.}../*.** Fill
15a80 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
15a90 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
15aa0 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
15ab0 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
15ac0 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
15ad0 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
15ae0 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
15af0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
15b00 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
15b10 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61  suppose to conta
15b20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
15b30 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
15b40 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
15b50 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
15b60 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
15b70 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
15b80 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
15b90 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
15ba0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
15bb0 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
15bc0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
15bd0 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
15be0 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
15bf0 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
15c00 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
15c10 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
15c20 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
15c30 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
15c40 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61  ticular combinia
15c50 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
15c60 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
15c70 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
15c80 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
15c90 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
15ca0 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
15cb0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
15cc0 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
15cd0 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
15ce0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
15cf0 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
15d00 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
15d10 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
15d20 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
15d30 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
15d40 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
15d50 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
15d60 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
15d70 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
15d80 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
15d90 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
15da0 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
15db0 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
15dc0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
15dd0 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
15de0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20  {.  unsigned *a 
15df0 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  = pIdx->aiRowEst
15e00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
15e10 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61  ert( a!=0 );.  a
15e20 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  [0] = 1000000;. 
15e30 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f   for(i=pIdx->nCo
15e40 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29  lumn; i>=5; i--)
15e50 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a  {.    a[i] = 5;.
15e60 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d    }.  while( i>=
15e70 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  1 ){.    a[i] = 
15e80 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b  11 - i;.    i--;
15e90 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
15ea0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
15eb0 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d  e ){.    a[pIdx-
15ec0 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20  >nColumn] = 1;. 
15ed0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
15ee0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
15ef0 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
15f00 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
15f10 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
15f20 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
15f30 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
15f40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15f50 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
15f60 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
15f70 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
15f80 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
15f90 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
15fa0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
15fb0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15fc0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
15fd0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
15fe0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
15ff0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
16000 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
16010 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
16020 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
16030 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16040 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
16050 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
16060 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16070 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
16080 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
16090 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
160a0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
160b0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
160c0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
160d0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
160e0 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
160f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16100 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
16110 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
16120 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
16130 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
16140 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
16150 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
16160 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
16170 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
16180 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
16190 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
161a0 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
161b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
161c0 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
161d0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
161e0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
161f0 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
16200 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16210 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
16220 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
16230 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
16240 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
16250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16260 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
16270 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
16280 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
16290 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
162a0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
162b0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
162c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
162d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
162e0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
162f0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
16300 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
16310 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
16320 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
16330 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
16340 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
16350 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
16360 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
16370 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
16380 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
16390 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
163a0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
163b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
163c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
163d0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
163e0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
163f0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
16400 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
16410 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
16420 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
16430 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
16440 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
16450 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
16460 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
16470 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16480 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
16490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
164a0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
164b0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
164c0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
164d0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
164e0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
164f0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
16500 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
16510 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16520 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
16530 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
16540 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
16550 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
16560 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
16570 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
16580 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
16590 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
165a0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
165b0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
165c0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
165d0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
165e0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
165f0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
16600 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
16610 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
16620 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
16630 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
16640 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
16650 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
16660 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
16670 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
16680 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
16690 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
166a0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
166b0 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
166c0 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
166d0 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
166e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
166f0 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
16700 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
16710 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
16720 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
16730 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
16740 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
16750 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
16760 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
16770 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
16780 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
16790 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
167a0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
167b0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
167c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
167d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
167e0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
167f0 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
16800 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
16810 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
16820 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
16830 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
16840 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
16850 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
16860 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
16870 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16880 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
16890 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
168a0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
168b0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
168c0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
168d0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
168e0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
168f0 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
16900 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
16910 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
16920 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
16930 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
16940 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
16950 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
16960 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
16970 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
16980 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
16990 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
169a0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
169b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
169c0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
169d0 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
169e0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
169f0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
16a00 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
16a10 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
16a20 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
16a30 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
16a40 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
16a50 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
16a60 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
16a70 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
16a80 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
16a90 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
16aa0 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
16ab0 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
16ac0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
16ad0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
16ae0 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
16af0 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
16b00 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
16b10 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
16b20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
16b30 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
16b40 6f 63 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20  oc = newSize;.  
16b50 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
16b60 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
16b70 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
16b80 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a  et(&z[*pnEntry *
16b90 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
16ba0 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
16bb0 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b  = *pnEntry;.  ++
16bc0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
16bd0 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
16be0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
16bf0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
16c00 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
16c10 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
16c20 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
16c30 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
16c40 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
16c50 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
16c60 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
16c70 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
16c80 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
16c90 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
16ca0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
16cb0 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
16cc0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16cd0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
16ce0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
16cf0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
16d00 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
16d10 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16d20 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
16d30 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
16d40 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
16d50 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
16d60 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
16d70 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
16d80 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
16d90 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35  ->a[0]),.      5
16da0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
16db0 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  nId,.      &pLis
16dc0 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  t->nAlloc,.     
16dd0 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
16de0 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
16df0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
16e00 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
16e10 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
16e20 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
16e30 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
16e40 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
16e50 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
16e60 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
16e70 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
16e80 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
16e90 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a 70  Delete(IdList *p
16ea0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
16eb0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16ec0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16ed0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
16ee0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
16ef0 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d 3e  te3_free(pList->
16f00 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
16f10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16f20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
16f30 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
16f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16f50 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
16f60 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
16f70 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
16f80 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
16f90 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
16fa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
16fb0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
16fc0 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
16fd0 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
16fe0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
16ff0 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
17000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
17010 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
17020 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
17030 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
17040 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
17050 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
17060 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
17070 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17080 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
17090 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
170a0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
170b0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
170c0 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
170d0 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
170e0 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
170f0 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65  st even if pToke
17100 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
17110 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   A new SrcList i
17120 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
17130 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
17140 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fails..**.** If 
17150 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
17160 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
17170 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
17180 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
17190 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
171a0 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
171b0 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
171c0 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
171d0 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
171e0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
171f0 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
17200 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
17210 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
17220 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
17230 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
17240 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
17250 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
17260 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
17270 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
17280 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
17290 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
172a0 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
172b0 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
172c0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
172d0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
172e0 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
172f0 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
17300 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
17310 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
17320 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
17330 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
17340 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
17350 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17360 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
17370 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
17380 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
17390 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
173a0 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
173b0 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
173c0 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
173d0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
173e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
173f0 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
17400 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
17410 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
17420 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
17430 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ame..*/.SrcList 
17440 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
17450 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
17460 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
17470 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
17480 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
17490 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
174a0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
174b0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
174c0 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
174d0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
174e0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
174f0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
17500 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
17510 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
17520 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
17530 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
17540 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
17550 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
17560 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
17570 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
17580 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
17590 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
175a0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
175b0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
175c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
175d0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
175e0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
175f0 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
17600 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
17610 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
17620 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
17630 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
17640 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
17650 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2c 0a  lloc(db, pList,.
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17670 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
17680 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
17690 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
176a0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
176b0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
176c0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
176d0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
176e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
176f0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
17700 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
17710 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
17720 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
17730 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
17740 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
17750 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
17760 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
17770 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
17780 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
17790 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
177a0 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
177b0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
177c0 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
177d0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
177e0 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
177f0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
17800 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
17810 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
17820 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
17830 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
17840 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
17850 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
17860 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74  Database);.  pIt
17870 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31  em->iCursor = -1
17880 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70  ;.  pItem->isPop
17890 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c  ulated = 0;.  pL
178a0 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72  ist->nSrc++;.  r
178b0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
178c0 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72  /*.** Assign cur
178d0 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  sors to all tabl
178e0 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
178f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
17900 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
17910 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
17920 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
17930 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
17940 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
17950 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
17960 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
17970 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
17980 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
17990 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
179a0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
179b0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
179c0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
179d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
179e0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
179f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
17a00 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
17a10 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17a20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
17a30 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
17a40 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
17a50 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
17a60 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
17a70 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
17a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17a90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17aa0 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
17ab0 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
17ac0 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
17ad0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17ae0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
17af0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
17b00 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
17b10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17b20 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
17b30 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
17b40 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
17b50 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
17b60 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
17b70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
17b80 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d  ite3_free(pItem-
17b90 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
17ba0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
17bb0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
17bc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
17bd0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
17be0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
17bf0 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61 62  able(pItem->pTab
17c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
17c10 6c 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d  lectDelete(pItem
17c20 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
17c30 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17c40 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  e(pItem->pOn);. 
17c50 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
17c60 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55  Delete(pItem->pU
17c70 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
17c80 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29  ite3_free(pList)
17c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17ca0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17cb0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
17cc0 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
17cd0 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
17ce0 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
17cf0 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
17d00 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
17d10 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
17d20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
17d30 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
17d40 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
17d50 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
17d60 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
17d70 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
17d80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
17d90 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
17da0 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
17db0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
17dc0 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
17dd0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
17de0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
17df0 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
17e00 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
17e10 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
17e20 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
17e30 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
17e40 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
17e50 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65  has a alias, the
17e60 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
17e70 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
17e80 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
17e90 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
17ea0 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
17eb0 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
17ec0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
17ed0 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
17ee0 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
17ef0 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
17f00 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
17f10 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
17f20 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
17f30 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
17f40 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
17f50 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
17f60 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
17f70 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
17f80 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
17f90 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
17fa0 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
17fb0 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
17fc0 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
17fd0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
17fe0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
17ff0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
18000 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
18010 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
18020 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18040 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
18050 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18060 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
18070 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
18080 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
18090 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
180a0 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
180b0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
180c0 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
180d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
180e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
180f0 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
18100 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
18110 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
18120 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
18130 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
18140 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
18150 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
18160 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
18170 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
18180 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
18190 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
181a0 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
181b0 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
181c0 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
181d0 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
181e0 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
181f0 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
18200 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
18210 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18220 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
18230 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18240 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 73  rse->db;.  p = s
18250 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
18260 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
18270 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
18280 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
18290 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nSrc==0 ){.    s
182a0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
182b0 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pOn);.    sqlit
182c0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
182d0 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  Using);.    sqli
182e0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
182f0 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  pSubquery);.    
18300 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20  return p;.  }.  
18310 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
18320 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
18330 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73  pAlias && pAlias
18340 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
18350 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
18360 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
18370 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
18380 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
18390 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
183a0 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
183b0 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
183c0 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
183d0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
183e0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
183f0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
18400 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
18410 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
18420 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
18430 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
18440 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
18450 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
18460 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
18470 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
18480 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
18490 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
184a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
184b0 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
184c0 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
184d0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
184e0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
184f0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
18500 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
18510 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
18520 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
18530 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
18540 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
18550 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
18560 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
18570 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
18580 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
18590 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
185a0 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
185b0 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
185c0 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
185d0 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
185e0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
185f0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
18600 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
18610 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
18620 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
18630 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
18640 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
18650 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
18660 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20  ( p && p->a ){. 
18670 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
18680 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
18690 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
186a0 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[i].jointype
186b0 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69   = p->a[i-1].joi
186c0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
186d0 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70   p->a[0].jointyp
186e0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
186f0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
18700 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
18710 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
18720 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
18730 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
18740 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18750 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
18760 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  t i;..  if( pPar
18770 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
18780 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
18790 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
187a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
187b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
187c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
187d0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
187e0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
187f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18800 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
18810 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
18820 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
18830 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18840 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
18850 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18860 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
18870 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
18880 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
18890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
188a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
188b0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
188c0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
188d0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
188e0 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
188f0 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
18900 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
18910 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
18920 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
18930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
18940 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
18950 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
18960 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
18970 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18980 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18990 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
189a0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
189b0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
189c0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
189d0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
189e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
189f0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
18a00 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
18a10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
18a20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18a30 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
18a40 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
18a50 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
18a60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
18a70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
18a80 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
18a90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18aa0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
18ab0 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
18ac0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
18ad0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
18ae0 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
18af0 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
18b00 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
18b10 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
18b20 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
18b30 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
18b40 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
18b50 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
18b60 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
18b70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
18b80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18b90 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
18ba0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18bb0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
18bc0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
18bd0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
18be0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
18bf0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18c00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18c10 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
18c20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18c30 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
18c40 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
18c50 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
18c60 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
18c70 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
18c80 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
18c90 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
18ca0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
18cb0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
18cc0 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
18cd0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
18ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
18cf0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
18d00 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18d10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
18d20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
18d30 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
18d40 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
18d50 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
18d60 6e 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69  nt rc;.    stati
18d70 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
18d80 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
18d90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
18da0 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
18db0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18dc0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
18dd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
18de0 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
18df0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
18e00 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
18e10 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18e20 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
18e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18e40 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30  reeFactory(db, 0
18e50 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  , 0, SQLITE_DEFA
18e60 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20  ULT_CACHE_SIZE, 
18e70 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  flags,.         
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62          &db->aDb
18ea0 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66  [1].pBt);.    if
18eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18ec0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18ed0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18ee0 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
18ef0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
18f00 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
18f10 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
18f20 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
18f30 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
18f40 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
18f50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
18f60 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
18f70 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f  lags & !db->auto
18f80 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
18f90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18fa0 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
18fb0 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a  aDb[1].pBt, 1);.
18fc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18fe0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18ff0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
19000 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
19010 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
19020 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
19030 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
19040 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50  le");.        pP
19050 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
19060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19080 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
19090 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
190a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
190b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
190c0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
190d0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
190e0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
190f0 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
19100 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
19110 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
19120 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
19130 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
19140 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
19150 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
19160 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
19170 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
19180 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
19190 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
191a0 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
191b0 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
191c0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
191d0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
191e0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
191f0 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
19200 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
19210 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
19220 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
19230 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
19240 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19250 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
19260 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
19270 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
19280 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
19290 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
192a0 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
192b0 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
192c0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
192d0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
192e0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
192f0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
19300 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
19310 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
19320 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
19330 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
19340 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
19350 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
19360 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
19370 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
19380 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
19390 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
193a0 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
193b0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
193c0 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
193d0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
193e0 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
193f0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
19400 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
19410 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
19420 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
19430 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
19440 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
19450 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
19460 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
19470 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
19480 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
19490 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
194a0 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
194b0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
194c0 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
194d0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
194e0 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
194f0 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
19500 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
19510 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
19520 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
19530 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
19540 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
19550 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
19560 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
19570 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
19580 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
19590 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
195a0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
195b0 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
195c0 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
195d0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
195e0 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
195f0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
19600 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
19610 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
19620 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
19630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19640 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19650 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
19660 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
19670 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
19680 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
19690 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
196a0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
196b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
196c0 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
196d0 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d  ACHED+2 );.    m
196e0 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
196f0 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
19700 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
19710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
19720 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
19730 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
19740 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
19750 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
19760 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
19770 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
19780 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
19790 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
197a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
197b0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
197c0 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ase(pParse);.   
197d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
197e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
197f0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
19800 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
19810 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
19820 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
19830 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
19840 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
19850 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
19860 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
19870 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
19880 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
19890 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
198a0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
198b0 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
198c0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
198d0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
198e0 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
198f0 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
19900 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
19910 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
19920 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
19930 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
19940 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
19950 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
19960 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
19970 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
19980 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
19990 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
199a0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
199b0 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
199c0 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
199d0 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
199e0 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
199f0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
19a00 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
19a10 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
19a20 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
19a30 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
19a40 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
19a50 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
19a60 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
19a70 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
19a80 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  t be set..**.** 
19a90 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44  Only database iD
19aa0 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  b and the temp d
19ab0 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
19ac0 20 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69   writable by thi
19ad0 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44  s call..** If iD
19ae0 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d  b==0, then the m
19af0 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74  ain and temp dat
19b00 61 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20  abases are made 
19b10 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a  writable.   If.*
19b20 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e  * iDb==1 then on
19b30 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ly the temp data
19b40 62 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69  base is made wri
19b50 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31  table.  If iDb>1
19b60 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65   then the.** spe
19b70 63 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79  cified auxiliary
19b80 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
19b90 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
19ba0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
19bb0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
19bc0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
19bd0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
19be0 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
19bf0 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
19c00 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
19c10 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
19c20 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
19c30 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
19c40 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
19c50 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
19c60 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74  ;.  pParse->writ
19c70 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b  eMask |= 1<<iDb;
19c80 0a 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d  .  if( setStatem
19c90 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ent && pParse->n
19ca0 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
19cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19cc0 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  (v, OP_Statement
19cd0 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20  , iDb, 0);.  }. 
19ce0 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d 50 44   if( (OMIT_TEMPD
19cf0 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26 26 20  B || iDb!=1) && 
19d00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
19d10 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20  1].pBt!=0 ){.   
19d20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
19d30 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
19d40 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74  se, setStatement
19d50 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
19d60 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19d70 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
19d80 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
19d90 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
19da0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
19db0 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
19dc0 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
19dd0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
19de0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
19df0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
19e00 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
19e10 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
19e20 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
19e30 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
19e40 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
19e50 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
19e60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
19e70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
19e80 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f  ;.    if( z==zCo
19e90 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c  ll || (z && zCol
19ea0 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  l && 0==sqlite3S
19eb0 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
19ec0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
19ed0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
19ee0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
19ef0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
19f00 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
19f10 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
19f20 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
19f30 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
19f40 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
19f50 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
19f60 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
19f70 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
19f80 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
19f90 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
19fa0 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
19fb0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
19fc0 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
19fd0 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
19fe0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
19ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1a000 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1a010 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1a020 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1a030 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1a040 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1a050 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1a060 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1a070 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1a080 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1a090 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1a0a0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1a0b0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1a0c0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1a0d0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1a0e0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1a0f0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1a100 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1a110 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1a120 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1a130 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1a140 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1a150 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1a160 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1a170 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1a180 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1a190 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1a1a0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1a1b0 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1a1c0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1a1d0 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1a1e0 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1a1f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a200 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1a210 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1a220 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1a230 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1a240 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1a250 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1a260 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1a270 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1a280 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a2a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1a2b0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1a2c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1a2d0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1a2e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1a2f0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1a300 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1a310 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1a320 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1a330 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1a340 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1a350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1a360 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1a370 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1a380 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1a390 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1a3a0 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1a3b0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1a3c0 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1a3d0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1a3e0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1a3f0 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1a400 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1a410 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1a420 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1a430 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1a440 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1a450 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1a460 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1a470 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1a480 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1a490 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1a4a0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1a4b0 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1a4e0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1a4f0 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1a500 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1a510 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1a520 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1a530 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1a540 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1a550 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1a560 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1a570 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1a580 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1a590 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1a5a0 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1a5b0 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1a5c0 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1a5d0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1a5e0 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1a5f0 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1a600 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1a610 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1a620 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1a630 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1a640 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1a650 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1a660 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1a670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a680 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1a690 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1a6a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1a6b0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1a6c0 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1a6d0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a6f0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1a700 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1a710 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1a720 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1a730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a740 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1a750 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1a760 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1a770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1a780 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a790 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1a7a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1a7b0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1a7c0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1a7d0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a7f0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1a800 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1a810 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1a840 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1a850 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a860 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1a870 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1a880 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1a890 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1a8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1a8b0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1a8c0 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1a8d0 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1a8e0 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1a8f0 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1a900 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1a910 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1a920 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1a930 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1a940 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1a950 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1a960 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1a970 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1a980 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1a990 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1a9a0 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30   || pName1->z==0
1a9b0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1a9c0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1a9d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1a9e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
1a9f0 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32  me2==0 || pName2
1aa00 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
1aa10 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
1aa20 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
1aa30 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
1aa40 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1aa50 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1aa60 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
1aa70 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
1aa80 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
1aa90 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
1aaa0 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
1aab0 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Coll, -1, 0);.  
1aac0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1aad0 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29       if( zColl )
1aae0 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e 64 65  {.        reinde
1aaf0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
1ab00 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
1ab10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ab20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
1ab30 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1ab40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1ab50 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  free(zColl);.  }
1ab60 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1ab70 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
1ab80 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
1ab90 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
1aba0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
1abb0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
1abc0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1abd0 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
1abe0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
1abf0 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
1ac00 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
1ac10 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1ac20 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1ac30 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
1ac40 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
1ac50 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1ac60 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
1ac70 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
1ac80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ac90 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1aca0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
1acb0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
1acc0 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66 28 20  _free(z);.  if( 
1acd0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
1ace0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1acf0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1ad00 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
1ad10 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1ad20 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1ad30 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
1ad40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1ad50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ad60 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
1ad70 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
1ad80 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
1ad90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1ada0 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d  * Return a dynam
1adb0 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b  icly allocated K
1adc0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1add0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1ade0 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65  d.** with OP_Ope
1adf0 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
1ae00 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  Write to access 
1ae10 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70  database index p
1ae20 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
1ae30 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
1ae40 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1ae50 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
1ae60 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
1ae70 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  se.** the caller
1ae80 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1ae90 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  for calling sqli
1aea0 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 74 68  te3_free() on th
1aeb0 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70  e returned .** p
1aec0 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72  ointer. If an er
1aed0 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20  ror occurs (out 
1aee0 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73  of memory or mis
1aef0 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  sing collation .
1af00 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55  ** sequence), NU
1af10 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
1af20 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  nd the state of 
1af30 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74  pParse updated t
1af40 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65  o reflect.** the
1af50 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e   error..*/.KeyIn
1af60 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78  fo *sqlite3Index
1af70 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70  Keyinfo(Parse *p
1af80 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
1af90 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
1afa0 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
1afb0 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
1afc0 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28  nBytes = sizeof(
1afd0 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c  KeyInfo) + (nCol
1afe0 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  -1)*sizeof(CollS
1aff0 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 4b  eq*) + nCol;.  K
1b000 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28  eyInfo *pKey = (
1b010 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65  KeyInfo *)sqlite
1b020 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
1b030 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74 65 73  arse->db, nBytes
1b040 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1b050 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d  {.    pKey->db =
1b060 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
1b070 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
1b080 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79  r = (u8 *)&(pKey
1b090 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  ->aColl[nCol]);.
1b0a0 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65      assert( &pKe
1b0b0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  y->aSortOrder[nC
1b0c0 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b  ol]==&(((u8 *)pK
1b0d0 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a  ey)[nBytes]) );.
1b0e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1b0f0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
1b100 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1b110 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
1b120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
1b130 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  oll );.      pKe
1b140 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
1b150 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1b160 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1b170 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70 4b 65  , -1);.      pKe
1b180 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
1b190 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
1b1a0 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[i];.    }.  
1b1b0 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d    pKey->nField =
1b1c0 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66   nCol;.  }..  if
1b1d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1b1e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1b1f0 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b  ee(pKey);.    pK
1b200 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1b210 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a           turn pKey;.}.