/ Hex Artifact Content
Login

Artifact 076619b2a5cbdbdabf5201fc45dda488d7f3cbe6:


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 30 30 20 32 30 30 36 2f 30 36 2f 31 34  1.400 2006/06/14
02f0: 20 31 39 3a 30 30 3a 32 31 20 64 72 68 20 45 78   19:00:21 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  k *p;..  if( 0==
08e0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
08f0: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
0900: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 69 44  SharedData || iD
0910: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
0920: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0930: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0940: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0950: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0960: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0970: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0980: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
09a0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
09b0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
09c0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
09d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09e0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09f0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
0a00: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
0a10: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
0a20: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72   sqliteReallocOr
0a30: 46 72 65 65 28 28 76 6f 69 64 20 2a 2a 29 26 70  Free((void **)&p
0a40: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a50: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a60: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a70: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a80: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a90: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0aa0: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0ab0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ac0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ad0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ae0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0af0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0b00: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a  = zName;.  }.}..
0b10: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
0b20: 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72  _TableLock instr
0b30: 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  uction for each 
0b40: 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20  table locked by 
0b50: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
0b60: 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20   (configured by 
0b70: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
0b80: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f  TableLock())..*/
0b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
0ba0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73  eTableLocks(Pars
0bb0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
0bc0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  t i;.  Vdbe *pVd
0bd0: 62 65 3b 20 0a 20 20 61 73 73 65 72 74 28 20 73  be; .  assert( s
0be0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
0bf0: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
0c00: 68 61 72 65 64 44 61 74 61 20 7c 7c 20 70 50 61  haredData || pPa
0c10: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3d  rse->nTableLock=
0c20: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  =0 );..  if( 0==
0c30: 28 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  (pVdbe = sqlite3
0c40: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
0c50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
0c60: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20    }..  for(i=0; 
0c70: 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  i<pParse->nTable
0c80: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
0c90: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26  TableLock *p = &
0ca0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0cb0: 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70  ck[i];.    int p
0cc0: 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20  1 = p->iDb;.    
0cd0: 69 66 28 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f  if( p->isWriteLo
0ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 31 20 3d  ck ){.      p1 =
0cf0: 20 2d 31 2a 28 70 31 2b 31 29 3b 0a 20 20 20 20   -1*(p1+1);.    
0d00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
0d10: 65 4f 70 33 28 70 56 64 62 65 2c 20 4f 50 5f 54  eOp3(pVdbe, OP_T
0d20: 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d  ableLock, p1, p-
0d30: 3e 69 54 61 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  >iTab, p->zName,
0d40: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P3_STATIC);.  }
0d50: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d60: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d70: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0d90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0da0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0db0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0dc0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0dd0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0de0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0df0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0e00: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0e10: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0e20: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0e30: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0e40: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0e50: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0e60: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0e70: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0e80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0e90: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0ea0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0eb0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0ec0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0ed0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0ee0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0ef0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0f00: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0f10: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0f20: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0f30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
0f40: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
0f50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0f60: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  sted ) return;. 
0f70: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 56   if( !pParse->pV
0f80: 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  dbe ){.    if( p
0f90: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0fa0: 45 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e  E_OK && pParse->
0fb0: 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nErr ){.      pP
0fc0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
0fd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 72  E_ERROR;.      r
0fe0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
0ff0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
1000: 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20  generating some 
1010: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
1020: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1030: 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f  he.  ** vdbe pro
1040: 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  gram.  */.  db =
1050: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
1060: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1070: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1080: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a0: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20  _Halt, 0, 0);.. 
10b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
10c0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
10d0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
10e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
10f0: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1100: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1110: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1120: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1130: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1140: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1150: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1160: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1170: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
1180: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1190: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
11a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
11b0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
11c0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
11d0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
11e0: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
11f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
1200: 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20  okieGoto>0 ){.  
1210: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1220: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1240: 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65  mpHere(v, pParse
1250: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b  ->cookieGoto-1);
1260: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
1270: 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62  , mask=1; iDb<db
1280: 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c  ->nDb; mask<<=1,
1290: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
12a0: 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61   if( (mask & pPa
12b0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29  rse->cookieMask)
12c0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
12f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1300: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1310: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
1320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1340: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44  VerifyCookie, iD
1350: 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  b, pParse->cooki
1360: 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20  eValue[iDb]);.  
1370: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1380: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
1390: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
13a0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
13b0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
13c0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
13d0: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
13e0: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
13f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1400: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1410: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1420: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1430: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1440: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1450: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1470: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1480: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1490: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  o);.    }..#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
14b0: 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20  RACE.    /* Add 
14c0: 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e  a No-op that con
14d0: 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65  tains the comple
14e0: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
14f0: 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20  ompiled SQL.    
1500: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  ** statement as 
1510: 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e  its P3 argument.
1520: 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20    This does not 
1530: 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74  change the funct
1540: 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20  ionality.    ** 
1550: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
1560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1570: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 69  his is used to i
1580: 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
1590: 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f  _trace()..    */
15a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15b0: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  Op3(v, OP_Noop, 
15c0: 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53  0, 0, pParse->zS
15d0: 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69  ql, pParse->zTai
15e0: 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b  l-pParse->zSql);
15f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1600: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
1610: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1620: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1630: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1640: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
1650: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
1660: 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 4d  ==0 && !sqlite3M
1670: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
1680: 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65  .    FILE *trace
1690: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
16a0: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
16b0: 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20  )!=0 ? stdout : 
16c0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
16d0: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
16e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16f0: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
1700: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61  Parse->nVar, pPa
1710: 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20  rse->nMem+3,.   
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
1740: 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78  ab+3, pParse->ex
1750: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
1760: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1770: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
1780: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
1790: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
17a0: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
17b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
17c0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
17d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
17e0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
17f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
1800: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
1810: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
1820: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
1830: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1840: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
1850: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
1860: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
1870: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
1880: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
1890: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
18a0: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
18b0: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
18c0: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
18d0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
18e0: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
18f0: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
1900: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1910: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
1920: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
1930: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
1940: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
1950: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
1960: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
1970: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
1980: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
1990: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
19a0: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
19b0: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
19c0: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
19d0: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
19e0: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
19f0: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
1a00: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
1a10: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
1a20: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
1a30: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
1a40: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
1a50: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1a60: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1a70: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1a80: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1a90: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1aa0: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1ab0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ac0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1ad0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1ae0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1af0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1b00: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
1b10: 6c 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  l;.# define SAVE
1b20: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1b30: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1b40: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1b50: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1b60: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1b70: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1b80: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1b90: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1ba0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1bb0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1bc0: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1bd0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1be0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1bf0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1c00: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
1c10: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1c20: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
1c30: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a      return;   /*
1c40: 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68   A malloc must h
1c50: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1c60: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  }.  pParse->nest
1c70: 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73  ed++;.  memcpy(s
1c80: 61 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d  aveBuf, &pParse-
1c90: 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b  >nVar, SAVE_SZ);
1ca0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
1cb0: 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45  e->nVar, 0, SAVE
1cc0: 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _SZ);.  sqlite3R
1cd0: 75 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c  unParser(pParse,
1ce0: 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c   zSql, 0);.  sql
1cf0: 69 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20  iteFree(zSql);. 
1d00: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1d10: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1d20: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1d30: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1d40: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1d50: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1d60: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1d70: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
1d80: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
1d90: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
1da0: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
1db0: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1dc0: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
1dd0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
1de0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1df0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1e00: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1e10: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
1e20: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
1e30: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
1e40: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
1e50: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
1e60: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
1e70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
1e80: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
1e90: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
1ea0: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
1eb0: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
1ec0: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
1ed0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
1ee0: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
1ef0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
1f00: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
1f10: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1f20: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1f30: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1f40: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
1f50: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
1f60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1f70: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
1f80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
1f90: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
1fa0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
1fb0: 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
1fc0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  =0 );.  for(i=OM
1fd0: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
1fe0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1ff0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2000: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
2010: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
2020: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
2030: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
2040: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2050: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
2060: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
2070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
2080: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2090: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  (&db->aDb[j].pSc
20a0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
20b0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
20c0: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  me)+1);.    if( 
20d0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
20e0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
20f0: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2100: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2110: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
2120: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
2130: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
2140: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
2150: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
2160: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
2170: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
2180: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
2190: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
21a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
21b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73   not found.  Als
21c0: 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72  o leave an.** er
21d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
21e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
21f0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
2200: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2210: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
2220: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2230: 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
2240: 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20   routine leaves 
2250: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2260: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
2270: 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c  Msg where.** sql
2280: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2290: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62  does not..*/.Tab
22a0: 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  le *sqlite3Locat
22b0: 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  eTable(Parse *pP
22c0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
22d0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
22e0: 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20  har *zDbase){.  
22f0: 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Table *p;..  /* 
2300: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
2310: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
2320: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
2330: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
2340: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
2350: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
2360: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
2370: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
2380: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
2390: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
23a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
23b0: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
23c0: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
23d0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
23e0: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
23f0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ){.    if( zDbas
2400: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2410: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2420: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
2430: 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73  e: %s.%s", zDbas
2440: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
2450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2460: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2470: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
2480: 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  le: %s", zName);
2490: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
24a0: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
24b0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
24c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
24d0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
24e0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
24f0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
2500: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
2510: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
2520: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
2530: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
2540: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2550: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2560: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
2570: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2580: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2590: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
25a0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
25b0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
25c0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
25d0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
25e0: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
25f0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
2600: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
2610: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
2620: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2630: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
2640: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2650: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2660: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2670: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
2680: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2690: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
26a0: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
26b0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
26d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
26e0: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
26f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2700: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2710: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2720: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2730: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2740: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2750: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2760: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
2770: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  ema = db->aDb[j]
2780: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66  .pSchema;.    if
2790: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
27a0: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
27b0: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
27c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
27d0: 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 7c  ssert( pSchema |
27e0: 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e  | (j==1 && !db->
27f0: 61 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20  aDb[1].pBt) );. 
2800: 20 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29     if( pSchema )
2810: 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  {.      p = sqli
2820: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
2830: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2840: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
2850: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  me)+1);.    }.  
2860: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
2870: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
2880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
2890: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
28a0: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
28b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
28c0: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
28d0: 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  {.  sqliteFree(p
28e0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
28f0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
2900: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2910: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
2920: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
2930: 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65   table, and free
2940: 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73  .** its memory s
2950: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a  tructures..**.**
2960: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65   The index is re
2970: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
2980: 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62  atabase hash tab
2990: 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73  les but.** it is
29a0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72   not unlinked fr
29b0: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61  om the Table tha
29c0: 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  t it indexes..**
29d0: 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20   Unlinking from 
29e0: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
29f0: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
2a00: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2a20: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
2a30: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e  (Index *p){.  In
2a40: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e  dex *pOld;.  con
2a50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2a60: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f   p->zName;..  pO
2a70: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2a80: 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
2a90: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
2aa0: 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d  me, strlen( zNam
2ab0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  e)+1, 0);.  asse
2ac0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
2ad0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65  Old==p );.  free
2ae0: 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Index(p);.}../*.
2af0: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2b00: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2b10: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2b20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2b30: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2b40: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2b50: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2b60: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2b70: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2b80: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2b90: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2ba0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2bb0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2bc0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2bd0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2be0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
2bf0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2c00: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2c10: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
2c20: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
2c30: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
2c40: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2c50: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
2c60: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
2c70: 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b  trlen(zIdxName);
2c80: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2c90: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2ca0: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2cb0: 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  en+1, 0);.  if( 
2cc0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66  pIndex ){.    if
2cd0: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
2ce0: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
2cf0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
2d00: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2d10: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d30: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
2d40: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
2d50: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2d60: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
2d70: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
2d80: 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  xt){}.      if( 
2d90: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
2da0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
2db0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
2dc0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
2dd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
2de0: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
2df0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
2e00: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
2e10: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2e20: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
2e30: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
2e40: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
2e50: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
2e60: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74  .** a single dat
2e70: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
2e80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
2e90: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
2ea0: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
2eb0: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
2ec0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
2ed0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
2ee0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
2ef0: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
2f00: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
2f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
2f20: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
2f30: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
2f40: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
2f50: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
2f60: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
2f70: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
2f80: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2f90: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
2fa0: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
2fb0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
2fc0: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
2fd0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
2fe0: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
2ff0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
3000: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
3010: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3020: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  {.  int i, j;.. 
3030: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3040: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3050: 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  ;.  for(i=iDb; i
3060: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3070: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3080: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3090: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
30a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30b0: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
30c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
30d0: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
30e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
30f0: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
3100: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3110: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3120: 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  nges;..  /* If o
3130: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3140: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3150: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3160: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3170: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
3180: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
3190: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
31a0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
31b0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
31c0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
31d0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
31e0: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
31f0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3200: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3210: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3220: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3230: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3240: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3250: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3270: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3280: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3290: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
32a0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
32b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
32c0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
32d0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
32e0: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
32f0: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3300: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3310: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3320: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3330: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3340: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3350: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3360: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3370: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62    sqliteFree(pDb
3380: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3390: 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  pDb->zName = 0;.
33a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
33b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
33c0: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
33d0: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
33e0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
33f0: 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  +;.  }.  memset(
3400: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20  &db->aDb[j], 0, 
3410: 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65  (db->nDb-j)*size
3420: 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b  of(db->aDb[j]));
3430: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a  .  db->nDb = j;.
3440: 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32    if( db->nDb<=2
3450: 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d   && db->aDb!=db-
3460: 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20  >aDbStatic ){.  
3470: 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62    memcpy(db->aDb
3480: 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c  Static, db->aDb,
3490: 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44   2*sizeof(db->aD
34a0: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69  b[0]));.    sqli
34b0: 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b  teFree(db->aDb);
34c0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
34d0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
34e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
34f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3500: 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  d whenever a rol
3510: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49  lback occurs.  I
3520: 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20  f there were.** 
3530: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
3540: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
3550: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68  ction, then we h
3560: 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  ave to reset the
3570: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
3580: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c  h tables and rel
3590: 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69  oad them from di
35a0: 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sk..*/.void sqli
35b0: 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72  te3RollbackInter
35c0: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
35d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
35e0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
35f0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
3600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
3610: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
3620: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
3630: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3640: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3650: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
3660: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
3670: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
3680: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
3690: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
36a0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
36b0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
36c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
36d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
36e0: 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  m a table or vie
36f0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3700: 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c  d sqliteResetCol
3710: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
3720: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
3730: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
3740: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
3750: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
3760: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
3770: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
3780: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
3790: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
37a0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
37b0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
37c0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
37d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
37e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
37f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
3800: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
3810: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
3820: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
3830: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
3840: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3850: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3860: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3870: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3880: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3890: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
38a0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
38b0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
38c0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
38d0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
38e0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
38f0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3900: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3910: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3920: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3930: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3940: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3950: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3960: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3970: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3980: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3990: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
39a0: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
39b0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
39c0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
39d0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
39e0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
39f0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3a00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3a10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
3a20: 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f  .** Indices asso
3a30: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3a40: 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b  table are unlink
3a50: 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22  ed from the "db"
3a60: 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75  .** data structu
3a70: 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20  re if db!=NULL. 
3a80: 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e   If db==NULL, in
3a90: 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74  dices attached t
3aa0: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61  o.** the table a
3ab0: 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20  re deleted, but 
3ac0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
3ad0: 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ey have already 
3ae0: 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64  been.** unlinked
3af0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3b00: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
3b10: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
3b20: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3b30: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3b40: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
3b50: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20  , *pNextFKey;.. 
3b60: 20 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20   db = 0;..  if( 
3b70: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
3b80: 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  rn;..  /* Do not
3b90: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
3ba0: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
3bb0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3bc0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3bd0: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3be0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3bf0: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3c00: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3c10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3c20: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3c30: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3c40: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3c50: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
3c60: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
3c70: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
3c80: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
3c90: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3ca0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3cb0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3cc0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
3cd0: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
3ce0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
3cf0: 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3d20: 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  Y.  /* Delete al
3d30: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3d40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3d50: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
3d60: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
3d70: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3d80: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
3d90: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
3da0: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
3db0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
3dc0: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
3dd0: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
3de0: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
3df0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
3e00: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
3e10: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
3e20: 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  d(&pTable->pSche
3e30: 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20  ma->aFKey,.     
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
3e60: 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  , strlen(pFKey->
3e70: 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29  zTo)+1)!=pFKey )
3e80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3e90: 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  (pFKey);.  }.#en
3ea0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
3eb0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
3ec0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
3ed0: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3ee0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3ef0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3f00: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
3f10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3f20: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
3f30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3f40: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
3f50: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
3f70: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
3f80: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43  elete(pTable->pC
3f90: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3fa0: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
3fb0: 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  (pTable);.  sqli
3fc0: 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a  teFree(pTable);.
3fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
3fe0: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
3ff0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4000: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
4010: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
4020: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
4030: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
4040: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4050: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4060: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4070: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
4080: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
4090: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
40a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
40b0: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
40c0: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
40d0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
40e0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
40f0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
4100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
4110: 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61  abName && zTabNa
4120: 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d  me[0] );.  pDb =
4130: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4140: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
4150: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
4160: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
4170: 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  zTabName, strlen
4180: 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b  (zTabName)+1,0);
4190: 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e  .  if( p ){.#ifn
41a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
41b0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
41c0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
41d0: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
41e0: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
41f0: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
4200: 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31  en(pF1->zTo) + 1
4210: 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71  ;.      pF2 = sq
4220: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
4230: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
4240: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
4250: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46  o);.      if( pF
4260: 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20  2==pF1 ){.      
4270: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
4280: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
4290: 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  a->aFKey, pF1->z
42a0: 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e  To, nTo, pF1->pN
42b0: 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65  extTo);.      }e
42c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
42d0: 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e  le( pF2 && pF2->
42e0: 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20  pNextTo!=pF1 ){ 
42f0: 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f  pF2=pF2->pNextTo
4300: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
4310: 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pF2 ){.         
4320: 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20   pF2->pNextTo = 
4330: 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20  pF1->pNextTo;.  
4340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4350: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4360: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4370: 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ble(db, p);.  }.
4380: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
4390: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
43a0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
43b0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
43c0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
43d0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
43e0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
43f0: 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79  * token with any
4400: 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f   quotations remo
4410: 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ved.  Space to h
4420: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
4430: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
4440: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4450: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
4460: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
4470: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
4480: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
4490: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
44a0: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
44b0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
44c0: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
44d0: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
44e0: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
44f0: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
4500: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
4510: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
4520: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4530: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
4540: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
4550: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54  3NameFromToken(T
4560: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4570: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
4580: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
4590: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
45a0: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 4e 61  rNDup((char*)pNa
45b0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
45c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
45d0: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
45e0: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
45f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4600: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4610: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4620: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
4630: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
4640: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
4650: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
4660: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
4670: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
4680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4690: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
46a0: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
46b0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
46c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
46d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
46e0: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
46f0: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4700: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
4710: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4720: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4730: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73  er, iDb, 0);.  s
4740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4750: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4760: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29   0, MASTER_ROOT)
4770: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4780: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
4790: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b  mColumns, 0, 5);
47a0: 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   /* sqlite_maste
47b0: 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20  r has 5 columns 
47c0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  */.}../*.** The 
47d0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
47e0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
47f0: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
4800: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
4810: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
4820: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4830: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
4840: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
4850: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
4860: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
4870: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
4880: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
4890: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
48a0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
48b0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
48c0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
48d0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
48e0: 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61  i = -1;    /* Da
48f0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
4900: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4920: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
4930: 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70   name */.  Db *p
4940: 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 64  Db;       /* A d
4950: 61 74 61 62 61 73 65 20 77 68 6f 73 65 20 6e 61  atabase whose na
4960: 6d 65 20 73 70 61 63 65 20 69 73 20 62 65 69 6e  me space is bein
4970: 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  g searched */.  
4980: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
4990: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
49a0: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a  arching for */..
49b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
49c0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
49d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
49e0: 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73 74  me ){.    n = st
49f0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
4a00: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
4a10: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
4a20: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
4a30: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
4a40: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
4a50: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
4a60: 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d  strlen(pDb->zNam
4a70: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  e) && .         
4a80: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
4a90: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
4aa0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
4ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4ac0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4ad0: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Free(zName);.  }
4ae0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
4af0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
4b00: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
4b10: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
4b20: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
4b30: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
4b40: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
4b50: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
4b60: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
4b70: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
4b80: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
4b90: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
4ba0: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
4bb0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4bc0: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
4bd0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
4be0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4bf0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
4c00: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
4c10: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
4c20: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
4c30: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
4c40: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
4c50: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
4c60: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
4c70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4c80: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
4c90: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
4ca0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
4cb0: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
4cc0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
4cd0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
4ce0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
4cf0: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
4d00: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4d10: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
4d20: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
4d30: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
4d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4d50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
4d60: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
4d70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4d80: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
4d90: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
4da0: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
4db0: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
4dc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4dd0: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
4de0: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
4df0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
4e00: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
4e10: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
4e20: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
4e30: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
4e40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4e70: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
4e80: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
4e90: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4ea0: 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20  ;..  if( pName2 
4eb0: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  && pName2->n>0 )
4ec0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  {.    assert( !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 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
4ef0: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
4f00: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
4f10: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
4f20: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
4f30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4f40: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
4f50: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
4f60: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
4f70: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4f80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
4f90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4fb0: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
4fc0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
4fd0: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
4fe0: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
4ff0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
5000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
5010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5020: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5030: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
5040: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
5050: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
5060: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
5070: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
5080: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
5090: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
50a0: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
50b0: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
50c0: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
50d0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
50e0: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
50f0: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
5100: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
5110: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
5120: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
5130: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
5140: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5150: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
5160: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
5170: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
5180: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
5190: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
51a0: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
51b0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
51c0: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
51d0: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
51e0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
51f0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
5200: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
5210: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
5220: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
5230: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
5240: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5250: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
5260: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
5270: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
5280: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
5290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
52a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
52b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52c0: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
52d0: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
52e0: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
52f0: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
5300: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
5310: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
5320: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
5330: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
5340: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
5350: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
5360: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
5370: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
5380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5390: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
53a0: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
53b0: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
53c0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
53d0: 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  me. The isTemp.*
53e0: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
53f0: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
5400: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
5410: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
5420: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
5430: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
5440: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
5450: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
5460: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
5470: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
5480: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
5490: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
54a0: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
54b0: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
54c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
54d0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
54e0: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
54f0: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
5500: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
5510: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
5520: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5530: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
5540: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
5550: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
5560: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
5570: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
5580: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
5590: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
55a0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
55b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
55c0: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
55d0: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
55e0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
55f0: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
5600: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
5610: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
5620: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
5630: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
5640: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
5650: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
5660: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5670: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
5680: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
5690: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
56a0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
56b0: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
56c0: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65  cond part of the
56d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
56e0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
56f0: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
5700: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
5710: 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65   is a TEMP table
5720: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
5730: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
5740: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57  f this is a VIEW
5750: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
5760: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
5770: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
5780: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
5790: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
57a0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
57b0: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
57c0: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
57d0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
57e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
57f0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
5800: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5810: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5820: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
5830: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
5840: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
5850: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
5860: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5870: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
5880: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
5890: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
58a0: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
58b0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
58c0: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
58d0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
58e0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
58f0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5900: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5910: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5920: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5930: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
5940: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
5950: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
5960: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
5970: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
5980: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
5990: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
59a0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
59b0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
59c0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
59d0: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
59e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
59f0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5a00: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5a10: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
5a20: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
5a30: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
5a40: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5a50: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5a60: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
5a70: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
5a80: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5a90: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5aa0: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
5ab0: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
5ac0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
5ad0: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
5ae0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
5af0: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
5b00: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
5b10: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
5b20: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
5b30: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
5b40: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
5b50: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
5b60: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5b70: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44   && isTemp && iD
5b80: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
5b90: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
5ba0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
5bb0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
5bc0: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
5bd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5be0: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
5bf0: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
5c00: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
5c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5c20: 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  }.  if( !OMIT_TE
5c30: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5c40: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
5c50: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
5c60: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
5c70: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5c80: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
5c90: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5ca0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5cb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5cc0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5cd0: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5ce0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5cf0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5d00: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5d10: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5d20: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5d40: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5d50: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
5d60: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
5d70: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
5d80: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
5d90: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5da0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5db0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5dc0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5dd0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5de0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5df0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5e00: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5e10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5e20: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5e30: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5e40: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5e50: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5e60: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5e70: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
5e80: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5e90: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
5ea0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
5eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5ec0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5ed0: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5ee0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5ef0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
5f00: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
5f10: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f20: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5f30: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
5f40: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
5f50: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5f60: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
5f70: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
5f80: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5f90: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
5fa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
5fb0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
5fc0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
5fd0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
5fe0: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
5ff0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
6000: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
6010: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
6020: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
6030: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
6040: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
6050: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
6060: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
6070: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
6080: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
6090: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
60a0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
60b0: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
60c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
60d0: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
60e0: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
60f0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
6100: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
6110: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
6120: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
6130: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
6140: 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  B ){.    if( SQL
6150: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
6160: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
6170: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6180: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6190: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
61a0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
61b0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
61c0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
61d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
61e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
61f0: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
6200: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6210: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
6220: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
6230: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
6240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6250: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6260: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6270: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
6280: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
6290: 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30  0)!=0 && (iDb==0
62a0: 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75   || !db->init.bu
62b0: 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sy) ){.      sql
62c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
62d0: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
62e0: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
62f0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
6300: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
6310: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
6330: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  able = sqliteMal
6340: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
6350: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
6360: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  le==0 ){.    pPa
6370: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
6380: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
6390: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
63a0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
63b0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
63c0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
63d0: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  ame;.  pTable->i
63e0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
63f0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ble->pSchema = d
6400: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
6410: 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ema;.  pTable->n
6420: 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Ref = 1;.  if( p
6430: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6440: 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65   ) sqlite3Delete
6450: 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65  Table(db, pParse
6460: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20  ->pNewTable);.  
6470: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6480: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
6490: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
64a0: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
64b0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
64c0: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
64d0: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
64e0: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
64f0: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
6500: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
6510: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
6520: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
6530: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
6540: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
6550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6560: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
6570: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
6580: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
6590: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
65a0: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
65b0: 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  {.    pTable->pS
65c0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
65d0: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
65e0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
65f0: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
6600: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
6610: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
6620: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
6630: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
6640: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
6650: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
6660: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
6670: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
6680: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
6690: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
66a0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
66b0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
66c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
66d0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
66e0: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
66f0: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
6700: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
6710: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
6720: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
6730: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
6740: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
6750: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
6760: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
6770: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6780: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
6790: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
67a0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
67b0: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
67c0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
67d0: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
67e0: 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20     int lbl;.    
67f0: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
6800: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
6810: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
6820: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
6830: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
6840: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
6850: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
6860: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
6870: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
6880: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
6890: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
68a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
68b0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
68c0: 44 62 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c  Db, 1);   /* fil
68d0: 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e_format */.    
68e0: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
68f0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
6900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6910: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c  dOp(v, OP_If, 0,
6920: 20 6c 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46   lbl);.    fileF
6930: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
6940: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
6950: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 44 45 46    1 : SQLITE_DEF
6980: 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
6990: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
69a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
69b0: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
69c0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
69d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
69e0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
69f0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
6a00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6a10: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
6a20: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6a30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6a40: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
6a50: 20 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   4);.    sqlite3
6a60: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6a70: 28 76 2c 20 6c 62 6c 29 3b 0a 0a 20 20 20 20 2f  (v, lbl);..    /
6a80: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
6a90: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
6aa0: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
6ab0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
6ac0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
6ad0: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
6ae0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
6af0: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
6b00: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
6b10: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
6b20: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
6b30: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
6b40: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6b50: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
6b60: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
6b70: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
6b80: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f  s left on the to
6b90: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
6ba0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
6bb0: 20 76 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64   value is needed
6bc0: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
6bd0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6be0: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65  e will.    ** ge
6bf0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
6c00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6c10: 49 54 5f 56 49 45 57 0a 20 20 20 20 69 66 28 20  IT_VIEW.    if( 
6c20: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
6c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c40: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6c50: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 0);.    }else
6c60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
6c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6c80: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74  ddOp(v, OP_Creat
6c90: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b  eTable, iDb, 0);
6ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
6cb0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
6cc0: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
6cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ce0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
6cf0: 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  wid, 0, 0);.    
6d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d10: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
6d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6d30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
6d40: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ll, 0, 0);.    s
6d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6d60: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c  v, OP_Insert, 0,
6d70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6d80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6d90: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
6da0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6db0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
6dc0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
6dd0: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
6de0: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
6df0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
6e00: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6e10: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
6e20: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
6e30: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  ror:.  sqliteFre
6e40: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
6e50: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
6e60: 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
6e70: 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73  to compare two s
6e80: 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65  trings in a case
6e90: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e  -insensitive man
6ea0: 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c  ner..** It is sl
6eb0: 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
6ec0: 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  an calling sqlit
6ed0: 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65  e3StrICmp() dire
6ee0: 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f  ctly, but.** pro
6ef0: 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64  duces larger cod
6f00: 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  e..**.** WARNING
6f10: 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  : This macro is 
6f20: 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77  not compatible w
6f30: 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29  ith the strcmp()
6f40: 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72   family. It.** r
6f50: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
6f60: 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61  he two strings a
6f70: 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77  re equal, otherw
6f80: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64  ise false..*/.#d
6f90: 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c  efine STRICMP(x,
6fa0: 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70   y) (\.sqlite3Up
6fb0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
6fc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29  igned char *)(x)
6fd0: 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55  ]==   \.sqlite3U
6fe0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
6ff0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79  signed char *)(y
7000: 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69  )]     \.&& sqli
7010: 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31  te3StrICmp((x)+1
7020: 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a  ,(y)+1)==0 )../*
7030: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
7040: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
7050: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
7060: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
7070: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
7080: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
7090: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
70a0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
70b0: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
70c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
70d0: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
70e0: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
70f0: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
7100: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
7110: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
7120: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7130: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
7140: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
7150: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
7160: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
7170: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
7180: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
7190: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c    char *z;.  Col
71a0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
71b0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
71c0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
71d0: 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
71e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
71f0: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
7200: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7210: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7220: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7230: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7240: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7260: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7270: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
7280: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
7290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
72a0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
72b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
72c0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
72d0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
72e0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
72f0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
7300: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
7310: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
7320: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
7330: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
7340: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
7350: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7360: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7370: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
7380: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
7390: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
73a0: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
73b0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
73c0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
73d0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
73e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
73f0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7400: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
7410: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
7420: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7430: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
7440: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
7450: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
7460: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
7470: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
7480: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
7490: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
74a0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
74b0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
74c0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
74d0: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
74e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
74f0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7500: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
7510: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7520: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7530: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7540: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7550: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7560: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7570: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
7580: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7590: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
75a0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
75b0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
75c0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
75d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
75e0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
75f0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
7600: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
7610: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
7620: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7630: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7640: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
7650: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
7660: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
7670: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
7680: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7690: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
76a0: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
76b0: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
76c0: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
76d0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
76e0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
76f0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
7700: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
7710: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
7720: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
7730: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
7740: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
7750: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
7760: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
7770: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
7780: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
7790: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
77a0: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
77b0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
77c0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
77d0: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
77e0: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
77f0: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
7800: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
7810: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
7820: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
7830: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7840: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
7850: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
7860: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
7870: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7890: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
78a0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
78b0: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
78c0: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
78d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
78e0: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
78f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7900: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
7910: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7920: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
7930: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7940: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
7950: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7960: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
7970: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
7980: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7990: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
79a0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
79b0: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
79c0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
79d0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
79e0: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
79f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7a00: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7a10: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7a20: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7a30: 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  t Token *pType){
7a40: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
7a50: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
7a60: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7a70: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7a80: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70  char *zIn = pTyp
7a90: 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  e->z;.  const un
7aa0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
7ab0: 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54  d = &pType->z[pT
7ac0: 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c  ype->n];..  whil
7ad0: 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a  e( zIn!=zEnd ){.
7ae0: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
7af0: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
7b00: 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20  ower[*zIn];.    
7b10: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
7b20: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
7b30: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
7b40: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
7b50: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
7b60: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7b70: 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20  E_AFF_TEXT; .   
7b80: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7b90: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
7ba0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
7bb0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
7bc0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
7bd0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7be0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7bf0: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
7c00: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
7c10: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
7c20: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
7c30: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7c40: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7c50: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
7c60: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7c70: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
7c80: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
7c90: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
7ca0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7cb0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
7cc0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
7cd0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7ce0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e  E_AFF_NONE;.#ifn
7cf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7d00: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
7d10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7d20: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
7d30: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
7d40: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
7d50: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
7d60: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7d70: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7d80: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7d90: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
7da0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
7db0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7dc0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
7dd0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
7de0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
7df0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
7e00: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
7e10: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
7e20: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
7e30: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
7e40: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
7e50: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7e60: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
7e70: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7e80: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7e90: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
7ea0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
7eb0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
7ec0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7ed0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7ee0: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7ef0: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7f00: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7f10: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
7f20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7f30: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
7f40: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
7f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7f60: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
7f70: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
7f80: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
7f90: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
7fa0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
7fb0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
7fc0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
7fd0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
7fe0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
7ff0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
8000: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
8010: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8020: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8030: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
8040: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
8050: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
8060: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
8070: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
8080: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
8090: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
80a0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
80b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
80c0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
80d0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
80e0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
80f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
8100: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
8110: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
8120: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
8130: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8140: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8150: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8160: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8170: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
8180: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
8190: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
81a0: 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 46  ol[i];.  sqliteF
81b0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
81c0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
81d0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
81e0: 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20  mToken(pType);. 
81f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8200: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
8210: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
8220: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
8230: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
8240: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8250: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8260: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
8270: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
8280: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
8290: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
82a0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
82b0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
82c0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
82d0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
82e0: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
82f0: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
8300: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8310: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
8320: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
8330: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
8340: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
8350: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8360: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
8370: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
8380: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
8390: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
83a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
83b0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
83c0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
83d0: 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b  pNewTable)!=0 ){
83e0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
83f0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8400: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
8410: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8420: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
8430: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
8440: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8450: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
8460: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
8470: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
8480: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
8490: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
84a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
84b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
84c0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
84d0: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
84e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
84f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
8500: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
8510: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a  elete(pExpr);.}.
8520: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
8530: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
8540: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
8550: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
8560: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
8570: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
8580: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
8590: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
85a0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
85b0: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
85c0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
85d0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
85e0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
85f0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
8600: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
8610: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
8620: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
8630: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
8640: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
8650: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
8660: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
8670: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
8680: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
8690: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
86a0: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
86b0: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
86c0: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
86d0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
86e0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
86f0: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
8700: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
8710: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
8720: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
8730: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
8740: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
8750: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
8760: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8770: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
8780: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
8790: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
87a0: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
87b0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
87c0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
87d0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
87e0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
87f0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
8800: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
8810: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
8820: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
8830: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8840: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
8850: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
8860: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
8870: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8880: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8890: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
88a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
88b0: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
88c0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
88d0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
88e0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
88f0: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
8900: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
8910: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
8920: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
8930: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
8940: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
8950: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
8960: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
8970: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
8980: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
8990: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
89a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
89b0: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
89c0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
89d0: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
89e0: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
89f0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
8a00: 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72   if( pTab->hasPr
8a10: 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  imKey ){.    sql
8a20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8a30: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
8a40: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
8a50: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
8a60: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
8a70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
8a80: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
8a90: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68  t;.  }.  pTab->h
8aa0: 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  asPrimKey = 1;. 
8ab0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
8ac0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
8ad0: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
8ae0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8af0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
8b00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
8b10: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
8b20: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8b30: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
8b40: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
8b50: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
8b60: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
8b70: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
8b80: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
8b90: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
8ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
8bb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
8bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8bd0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
8bf0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
8c00: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  rimKey = 1;.    
8c10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8c20: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
8c30: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
8c40: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
8c50: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
8c60: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
8c70: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
8c80: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
8c90: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
8ca0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
8cb0: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
8cc0: 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74  .        && sort
8cd0: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
8ce0: 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62  _ASC ){.    pTab
8cf0: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
8d00: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
8d10: 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  f = onError;.   
8d20: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d   pTab->autoInc =
8d30: 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73   autoInc;.  }els
8d40: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
8d50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8d60: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
8d70: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
8d80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8d90: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
8da0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
8db0: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
8dc0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8dd0: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
8de0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
8df0: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
8e00: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
8e10: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  st, onError, 0, 
8e20: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29  0, sortOrder, 0)
8e30: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
8e40: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
8e50: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
8e60: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8e70: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
8e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
8e90: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
8ea0: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
8eb0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8ec0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8ed0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8ee0: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
8ef0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
8f00: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8f10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8f20: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
8f30: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
8f40: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
8f50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8f60: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
8f70: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
8f80: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
8f90: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 2f  f( pTab ){.    /
8fa0: 2a 20 54 68 65 20 43 48 45 43 4b 20 65 78 70 72  * The CHECK expr
8fb0: 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64  ession must be d
8fc0: 75 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61  uplicated so tha
8fd0: 74 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20  t tokens refer. 
8fe0: 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65     ** to malloce
8ff0: 64 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20  d space and not 
9000: 74 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20  the (ephemeral) 
9010: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
9020: 54 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20  TE TABLE.    ** 
9030: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
9040: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
9050: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
9060: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 73 71 6c  Tab->pCheck, sql
9070: 69 74 65 33 45 78 70 72 44 75 70 28 70 43 68 65  ite3ExprDup(pChe
9080: 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23 65  ckExpr));.  }.#e
9090: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
90a0: 70 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b 45  prDelete(pCheckE
90b0: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  xpr);.}../*.** S
90c0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
90d0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
90e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
90f0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
9100: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
9110: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
9120: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9130: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
9140: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9150: 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20  har *zType, int 
9160: 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  nType){.  Table 
9170: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *p;.  int i;..  
9180: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
9190: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
91a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
91b0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66 28  ->nCol-1;..  if(
91c0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
91d0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
91e0: 79 70 65 2c 20 6e 54 79 70 65 29 20 29 7b 0a 20  ype, nType) ){. 
91f0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
9200: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
9210: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  Coll = sqliteStr
9220: 4e 44 75 70 28 7a 54 79 70 65 2c 20 6e 54 79 70  NDup(zType, nTyp
9230: 65 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  e);.  .    /* If
9240: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
9250: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
9260: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
9270: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
9280: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
9290: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
92a0: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
92b0: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
92c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
92d0: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
92e0: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
92f0: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
9300: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
9310: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
9320: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
9330: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
9340: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
9350: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
9360: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
9370: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
9380: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
9390: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
93a0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
93b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
93c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
93d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
93e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
93f0: 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61  uence for databa
9400: 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a  se native text.*
9410: 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74  * encoding ident
9420: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72  ified by the str
9430: 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ing zName, lengt
9440: 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  h nName..**.** I
9450: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
9460: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9470: 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ce is not availa
9480: 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69  ble, or not avai
9490: 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20  lable.** in the 
94a0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
94b0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f  encoding, the co
94c0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
94d0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a  is invoked to.**
94e0: 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20   request it. If 
94f0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9500: 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73  ctory does not s
9510: 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71  upply such a seq
9520: 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68  uence,.** and th
9530: 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76  e sequence is av
9540: 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  ailable in anoth
9550: 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  er text encoding
9560: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a  , then that is.*
9570: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  * returned inste
9580: 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ad..**.** If no 
9590: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
95a0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
95b0: 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72  ions sequence ar
95c0: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a  e available, or.
95d0: 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  ** another error
95e0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
95f0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
9600: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9610: 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70  ritten into.** p
9620: 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  Parse..*/.CollSe
9630: 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  q *sqlite3Locate
9640: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
9650: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
9660: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
9670: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
9680: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9690: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
96a0: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
96b0: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
96c0: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
96d0: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
96e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
96f0: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
9700: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74  ame, nName, init
9710: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
9720: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
9730: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
9740: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
9750: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
9760: 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a  Seq(db, pColl, z
9770: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
9780: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
9790: 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c        if( nName<
97a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61  0 ){.        nNa
97b0: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
97c0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
97d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
97e0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
97f0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
9800: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
9810: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
9820: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
9830: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
9840: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
9850: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9860: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
9870: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
9880: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
9890: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
98a0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
98b0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
98c0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
98d0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
98e0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
98f0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
9900: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
9910: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
9920: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
9930: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
9940: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9950: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9960: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9970: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9980: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9990: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
99a0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
99b0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
99c0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
99d0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
99e0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
99f0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
9a00: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
9a10: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
9a20: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
9a30: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
9a40: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9a50: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9a60: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9a70: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9a80: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9a90: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9aa0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9ab0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9ac0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9ad0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9ae0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
9af0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
9b00: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
9b10: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
9b20: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
9b30: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a  Cookie(sqlite3 *
9b40: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
9b50: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
9b60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9b70: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
9b80: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
9b90: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
9ba0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
9bb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
9bc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b  Cookie, iDb, 0);
9bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
9be0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
9bf0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
9c00: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
9c10: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
9c20: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
9c30: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
9c40: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
9c50: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
9c60: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
9c70: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
9c80: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
9c90: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
9ca0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
9cb0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
9cc0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
9cd0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
9ce0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
9cf0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
9d00: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
9d10: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
9d20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
9d30: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
9d40: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
9d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9d60: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
9d70: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9d80: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
9d90: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
9da0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
9db0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
9dc0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
9dd0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
9de0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
9df0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
9e00: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
9e10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
9e20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
9e30: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
9e40: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
9e50: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
9e60: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
9e70: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
9e80: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
9e90: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
9ea0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
9eb0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
9ec0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
9ed0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9ef0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
9f00: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
9f10: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
9f20: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
9f30: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
9f40: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
9f50: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
9f60: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
9f70: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
9f80: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9f90: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
9fa0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
9fb0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
9fc0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
9fd0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9fe0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9ff0: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a000: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a010: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a020: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a030: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a040: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a050: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a060: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a070: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a080: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a090: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a0a0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a0b0: 53 74 6d 74 28 54 61 62 6c 65 20 2a 70 2c 20 69  Stmt(Table *p, i
a0c0: 6e 74 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e  nt isTemp){.  in
a0d0: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
a0e0: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
a0f0: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
a100: 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c  *zEnd, *z;.  Col
a110: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
a120: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
a130: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
a140: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
a150: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
a160: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
a170: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a  l->zName);.    z
a180: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
a190: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
a1a0: 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28     n += (strlen(
a1b0: 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20  z) + 1);.    }. 
a1c0: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
a1d0: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
a1e0: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20  .  if( n<50 ){. 
a1f0: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
a200: 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20    zSep2 = ",";. 
a210: 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20     zEnd = ")";. 
a220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70   }else{.    zSep
a230: 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a   = "\n  ";.    z
a240: 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a  Sep2 = ",\n  ";.
a250: 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22      zEnd = "\n)"
a260: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20  ;.  }.  n += 35 
a270: 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a  + 6*p->nCol;.  z
a280: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
a290: 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69  locRaw( n );.  i
a2a0: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65  f( zStmt==0 ) re
a2b0: 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79  turn 0;.  strcpy
a2c0: 28 7a 53 74 6d 74 2c 20 21 4f 4d 49 54 5f 54 45  (zStmt, !OMIT_TE
a2d0: 4d 50 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22  MPDB&&isTemp ? "
a2e0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
a2f0: 45 20 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c  E ":"CREATE TABL
a300: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c  E ");.  k = strl
a310: 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  en(zStmt);.  ide
a320: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a330: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
a340: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
a350: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
a360: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a370: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a380: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
a390: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
a3a0: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
a3b0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
a3c0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
a3d0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a3e0: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
a3f0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20  );.    if( (z = 
a400: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20  pCol->zType)!=0 
a410: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b  ){.      zStmt[k
a420: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
a430: 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b   strcpy(&zStmt[k
a440: 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b  ], z);.      k +
a450: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
a460: 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28   }.  }.  strcpy(
a470: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29  &zStmt[k], zEnd)
a480: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
a490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a4a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a4b0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
a4c0: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
a4d0: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
a4e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a4f0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
a500: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
a510: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
a520: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
a530: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
a540: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
a550: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
a560: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
a570: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
a580: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
a590: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
a5a0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
a5b0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
a5c0: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
a5d0: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
a5e0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
a5f0: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
a600: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
a610: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
a620: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
a630: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
a640: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a650: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
a660: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
a670: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
a680: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
a690: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a6a0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
a6b0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
a6c0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
a6d0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
a6e0: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
a6f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
a700: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
a710: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
a720: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
a730: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
a740: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
a750: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
a760: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
a770: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
a780: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
a790: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
a7a0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
a7b0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
a7c0: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
a7d0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
a7e0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
a7f0: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
a800: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a810: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
a820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
a830: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
a840: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a850: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
a860: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
a870: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
a880: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
a890: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
a8a0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
a8b0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
a8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a8d0: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
a8e0: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
a8f0: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
a900: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
a910: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
a920: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
a930: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
a940: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
a950: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a960: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
a970: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
a980: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
a990: 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  ) || pParse->nEr
a9a0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  r || sqlite3Mall
a9b0: 6f 63 46 61 69 6c 65 64 28 29 20 29 20 7b 0a 20  ocFailed() ) {. 
a9c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
a9d0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
a9e0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
a9f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
aa00: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
aa10: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
aa20: 63 74 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73  ct );..  iDb = s
aa30: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
aa40: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
aa50: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
aa60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
aa70: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
aa80: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
aa90: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
aaa0: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
aab0: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
aac0: 20 20 20 20 53 72 63 4c 69 73 74 20 73 53 72 63      SrcList sSrc
aad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aae0: 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c      /* Fake SrcL
aaf0: 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ist for pParse->
ab00: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20  pNewTable */.   
ab10: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
ab20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab30: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
ab40: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
ab50: 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d  wTable */..    m
ab60: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
ab70: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
ab80: 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30   memset(&sSrc, 0
ab90: 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b  , sizeof(sSrc));
aba0: 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d  .    sSrc.nSrc =
abb0: 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   1;.    sSrc.a[0
abc0: 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61  ].zName = p->zNa
abd0: 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30  me;.    sSrc.a[0
abe0: 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20  ].pTab = p;.    
abf0: 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f  sSrc.a[0].iCurso
ac00: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e  r = -1;.    sNC.
ac10: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
ac20: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
ac30: 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73  t = &sSrc;.    s
ac40: 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a  NC.isCheck = 1;.
ac50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
ac60: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
ac70: 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29  &sNC, p->pCheck)
ac80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ac90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
aca0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
acb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
acc0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) */..  /* If th
acd0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
ace0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
acf0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ad00: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
ad10: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
ad20: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
ad30: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
ad40: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
ad50: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
ad60: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
ad70: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
ad80: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ad90: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
ada0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
adb0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
adc0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
add0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
ade0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
adf0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
ae00: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
ae10: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
ae20: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
ae30: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
ae40: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ae50: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
ae60: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
ae70: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
ae80: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
ae90: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
aea0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
aeb0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
aec0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
aed0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
aee0: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
aef0: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
af00: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
af10: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
af20: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
af30: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
af40: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
af50: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
af60: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
af70: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
af80: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
af90: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
afa0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
afb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
afc0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
afd0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
afe0: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
aff0: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
b000: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
b010: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
b020: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
b030: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
b040: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
b050: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
b060: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
b070: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b080: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b090: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b0a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
b0b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b0c0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
b0d0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
b0e0: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
b0f0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
b100: 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74 6f  and push it onto
b110: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
b120: 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e 6f  ** A view has no
b130: 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75   rootpage, so ju
b140: 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20 6f  st push a zero o
b150: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66 6f  nto the stack fo
b160: 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e 20  r.    ** views. 
b170: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
b180: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
b190: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  me..    */.    i
b1a0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
b1b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
b1c0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
b1d0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
b1e0: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
b1f0: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
b200: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b210: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
b220: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
b230: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
b240: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
b250: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
b260: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
b270: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
b280: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
b290: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
b2a0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
b2b0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
b2c0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
b2d0: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
b2e0: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
b2f0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
b300: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
b310: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
b320: 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b  f the vdbe stack
b330: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b340: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
b350: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
b360: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
b370: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
b380: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
b390: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
b3a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
b3b0: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
b3c0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
b3d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
b3e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
b3f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
b400: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
b410: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
b420: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
b430: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
b440: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
b450: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b460: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
b470: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
b480: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
b490: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
b4a0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
b4b0: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
b4c0: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
b4d0: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
b4e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b4f0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
b500: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
b510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b520: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
b530: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b550: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b560: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
b570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b580: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
b590: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
b5a0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
b5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
b5c0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
b5d0: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
b5e0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
b5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b600: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b610: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
b620: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
b630: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
b640: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
b650: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
b660: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
b670: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
b680: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
b690: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
b6a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
b6b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
b6c0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
b6d0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
b6e0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
b6f0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
b700: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
b710: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
b720: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
b730: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
b740: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
b750: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
b760: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
b770: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
b780: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
b790: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
b7a0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
b7b0: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
b7c0: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
b7d0: 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61  mt(p, p->pSchema
b7e0: 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ==pParse->db->aD
b7f0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
b800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b810: 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50  n = pEnd->z - pP
b820: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
b830: 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  .z + 1;.      zS
b840: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
b850: 69 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20  intf("CREATE %s 
b860: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
b870: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
b880: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a  oken.z);.    }..
b890: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
b8a0: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
b8b0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b8c0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
b8d0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
b8e0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
b8f0: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
b900: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
b910: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
b920: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
b930: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
b940: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
b950: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
b960: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
b970: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
b980: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
b990: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
b9a0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
b9b0: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
b9c0: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
b9d0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
b9e0: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
b9f0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
ba00: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
ba10: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
ba20: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
ba30: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
ba40: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
ba50: 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c  rootpage=#0, sql
ba60: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
ba70: 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20  ERE rowid=#1",. 
ba80: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
ba90: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
baa0: 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
bab0: 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
bac0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
bad0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a  ->zName,.      z
bae0: 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
baf0: 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
bb00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
bb10: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
bb20: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
bb30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
bb40: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
bb50: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
bb60: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  f we need to cre
bb70: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65  ate an sqlite_se
bb80: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72  quence table for
bb90: 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20  .    ** keeping 
bba0: 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63  track of autoinc
bbb0: 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20  rement keys..   
bbc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   */.    if( p->a
bbd0: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
bbe0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
bbf0: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69  Db[iDb];.      i
bc00: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
bc10: 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
bc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
bc30: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
bc40: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
bc50: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
bc60: 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
bc70: 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
bc80: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
bc90: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
bca0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
bcb0: 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
bcc0: 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
bcd0: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
bce0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
bcf0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
bd00: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
bd10: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
bd20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bd30: 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d  MPrintf("tbl_nam
bd40: 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65  e='%q'",p->zName
bd50: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
bd60: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
bd70: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
bd80: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
bd90: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
bda0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
bdb0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
bdc0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  sy && pParse->nE
bdd0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  rr==0 ){.    Tab
bde0: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b  le *pOld;.    FK
bdf0: 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20  ey *pFKey; .    
be00: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
be10: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
be20: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
be30: 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
be40: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
be50: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
be60: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20  ->zName)+1,p);. 
be70: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
be80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
be90: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
bea0: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
beb0: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
bec0: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
bed0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23   return;.    }.#
bee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bef0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
bf00: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
bf10: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
bf20: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
bf30: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
bf40: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
bf50: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
bf60: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
bf70: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
bf80: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
bf90: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
bfa0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
bfb0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
bfc0: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
bfd0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
bfe0: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
bff0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
c000: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
c010: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
c020: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
c030: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
c040: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
c050: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c060: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
c070: 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
c080: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
c090: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
c0a0: 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
c0b0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
c0c0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
c0d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c0e0: 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
c0f0: 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
c100: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
c110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
c120: 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
c130: 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
c140: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
c150: 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65  pCons->z - zName
c160: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
c170: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
c180: 71 6c 69 74 65 33 75 74 66 38 43 68 61 72 4c 65  qlite3utf8CharLe
c190: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
c1a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c1b0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
c1c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
c1d0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
c1e0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
c1f0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
c200: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
c210: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c220: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
c230: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c240: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
c250: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
c260: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
c270: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
c280: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
c290: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
c2a0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
c2b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
c2c0: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
c2d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
c2e0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
c2f0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
c300: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
c310: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c320: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
c330: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
c340: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
c350: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
c360: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
c370: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
c380: 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp         /* TR
c390: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
c3a0: 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20  RY view */.){.  
c3b0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
c3c0: 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  n;.  const unsig
c3d0: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  ned char *z;.  T
c3e0: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
c3f0: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
c400: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  en *pName;.  int
c410: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61   iDb;..  if( pPa
c420: 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
c430: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c440: 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
c450: 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
c460: 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
c470: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
c480: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
c490: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
c4a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
c4b0: 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
c4c0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
c4d0: 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 29 3b 0a   isTemp, 1, 0);.
c4e0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
c4f0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
c500: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
c510: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
c520: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
c530: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
c540: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
c550: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
c560: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
c570: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
c580: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
c590: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
c5a0: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
c5b0: 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ma);.  if( sqlit
c5c0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
c5d0: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
c5e0: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
c5f0: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
c600: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
c610: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
c620: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c630: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  e(pSelect);.    
c640: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
c650: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
c660: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
c670: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
c680: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
c690: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
c6a0: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
c6b0: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
c6c0: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
c6d0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
c6e0: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
c6f0: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
c700: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
c710: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
c720: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
c730: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
c740: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
c750: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
c760: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
c770: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
c780: 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63  SelectDup(pSelec
c790: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
c7a0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c7b0: 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  t);.  if( sqlite
c7c0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
c7d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
c7e0: 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72 73 65   }.  if( !pParse
c7f0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
c800: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
c810: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
c820: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
c830: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
c840: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
c850: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
c860: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
c870: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
c880: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
c890: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
c8a0: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
c8b0: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
c8c0: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
c8d0: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
c8e0: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
c8f0: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45  .n = 0;.  n = sE
c900: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
c910: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75  ;.  z = (const u
c920: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
c930: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
c940: 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d  ( n>0 && (z[n-1]
c950: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
c960: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
c970: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
c980: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
c990: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
c9a0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
c9b0: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
c9c0: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
c9d0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
c9e0: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
c9f0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
ca00: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
ca10: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ca20: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
ca30: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
ca40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ca50: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
ca60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ca70: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
ca80: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
ca90: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
caa0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
cab0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
cac0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
cad0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
cae0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
caf0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
cb00: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
cb10: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
cb20: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
cb30: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
cb40: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
cb50: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
cb60: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
cb70: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
cb80: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
cb90: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
cba0: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
cbb0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
cbc0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
cbd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
cbe0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
cbf0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
cc00: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
cc10: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
cc20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
cc30: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
cc40: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
cc50: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
cc60: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
cc70: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
cc80: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
cc90: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
cca0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
ccb0: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
ccc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ccd0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
cce0: 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
ccf0: 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
cd00: 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
cd10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
cd20: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
cd30: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
cd40: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
cd50: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
cd60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
cd70: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
cd80: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
cd90: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
cda0: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
cdb0: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
cdc0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
cdd0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
cde0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
cdf0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
ce00: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
ce10: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
ce20: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
ce30: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
ce40: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
ce50: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
ce60: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
ce70: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
ce80: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
ce90: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
cea0: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
ceb0: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
cec0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
ced0: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
cee0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
cef0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
cf00: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
cf10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
cf20: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
cf30: 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72  tually, this err
cf40: 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65  or is caught pre
cf50: 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74  viously and so t
cf60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
cf70: 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c  t.  ** should al
cf80: 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20  ways fail.  But 
cf90: 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74  we will leave it
cfa0: 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74   in place just t
cfb0: 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a  o be safe..  */.
cfc0: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
cfd0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
cfe0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cff0: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
d000: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
d010: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
d020: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
d030: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
d040: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
d050: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
d060: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
d070: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
d080: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
d090: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
d0a0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
d0b0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
d0c0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
d0d0: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
d0e0: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
d0f0: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
d100: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
d110: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
d120: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
d130: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
d140: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
d150: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
d160: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
d170: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
d180: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
d190: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
d1a0: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
d1b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
d1c0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
d1d0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
d1e0: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
d1f0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
d200: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
d210: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
d220: 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  (pTable->pSelect
d230: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
d240: 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
d250: 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
d260: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
d270: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
d280: 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
d290: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
d2a0: 31 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  1;.    pSelTab =
d2b0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
d2c0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
d2d0: 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  , 0, pSel);.    
d2e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
d2f0: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
d300: 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
d310: 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
d320: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
d330: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
d340: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
d350: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
d360: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
d370: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
d380: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
d390: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
d3b0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c  eteTable(0, pSel
d3c0: 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
d3d0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61  le->pSchema->fla
d3e0: 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
d3f0: 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Views;.    }else
d400: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
d410: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
d420: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
d430: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d440: 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d  elete(pSel);.  }
d450: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
d460: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
d470: 20 6e 45 72 72 3b 20 20 0a 23 65 6e 64 69 66 20   nErr;  .#endif 
d480: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
d490: 49 45 57 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 20  IEW */.}.#endif 
d4a0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
d4b0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
d4c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d4d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d4e0: 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
d4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d500: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
d510: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
d520: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
d530: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
d540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
d550: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
d560: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
d570: 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
d580: 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62  em *i;.  if( !Db
d590: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
d5a0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
d5b0: 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
d5c0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
d5d0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
d5e0: 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
d5f0: 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
d600: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
d610: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
d620: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
d630: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
d640: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
d650: 20 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74       sqliteReset
d660: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62  ColumnNames(pTab
d670: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  );.    }.  }.  D
d680: 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
d690: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
d6a0: 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
d6b0: 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
d6c0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
d6d0: 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
d6e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
d6f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
d700: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
d710: 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
d720: 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
d730: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
d740: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
d750: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
d760: 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
d770: 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
d780: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
d790: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
d7a0: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
d7b0: 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
d7c0: 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
d7d0: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
d7e0: 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
d7f0: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
d800: 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
d810: 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
d820: 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
d830: 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
d840: 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
d850: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
d860: 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
d870: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
d880: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
d890: 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
d8a0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
d8b0: 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
d8c0: 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
d8d0: 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
d8e0: 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
d8f0: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
d900: 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
d910: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
d920: 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
d930: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
d940: 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
d950: 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
d960: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
d970: 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
d980: 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
d990: 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
d9a0: 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
d9b0: 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
d9c0: 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
d9d0: 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
d9e0: 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
d9f0: 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
da00: 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
da10: 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
da20: 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
da30: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
da40: 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
da50: 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
da60: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
da70: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
da80: 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
da90: 6f 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a  otPageMoved(Db *
daa0: 70 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  pDb, int iFrom, 
dab0: 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
dac0: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
dad0: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70  ash *pHash;..  p
dae0: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
daf0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
db00: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
db10: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
db20: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
db30: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
db40: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
db50: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
db60: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
db70: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
db80: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
db90: 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
dba0: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
dbb0: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
dbc0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
dbd0: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
dbe0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
dbf0: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
dc00: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
dc10: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
dc20: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
dc30: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
dc40: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
dc50: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
dc60: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
dc70: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
dc80: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
dc90: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
dca0: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
dcb0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
dcc0: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
dcd0: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
dce0: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
dcf0: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
dd00: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
dd10: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
dd20: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
dd30: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
dd40: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
dd50: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
dd60: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
dd70: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
dd80: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
dd90: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
dda0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
ddb0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
ddc0: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
ddd0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
dde0: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
ddf0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
de00: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
de10: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
de20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
de30: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44  troy, iTable, iD
de40: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
de50: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
de60: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
de70: 6f 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74  oy pushes an int
de80: 65 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74  eger onto the st
de90: 61 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74  ack. If this int
dea0: 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
deb0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
dec0: 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
ded0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
dee0: 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
def0: 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
df00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
df10: 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
df20: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
df30: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
df40: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
df50: 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e    ** The "#0" in
df60: 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
df70: 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
df80: 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
df90: 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
dfa0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
dfb0: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73  he stack.  See s
dfc0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
dfd0: 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  pr()..  */.  sql
dfe0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
dff0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
e000: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
e010: 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
e020: 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67  E #0 AND rootpag
e030: 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72  e=#0",.     pPar
e040: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
e050: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
e060: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
e070: 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  e);.#endif.}../*
e080: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
e090: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
e0a0: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
e0b0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
e0c0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
e0d0: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
e0e0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e0f0: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
e100: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
e110: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
e120: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
e130: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
e140: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
e150: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
e160: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
e170: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
e180: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
e190: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
e1a0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
e1b0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
e1c0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
e1d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
e1e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e1f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
e200: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
e210: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
e220: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
e230: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
e240: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
e250: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
e260: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
e270: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
e280: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
e290: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
e2a0: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
e2b0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
e2c0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
e2d0: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
e2e0: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
e2f0: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
e300: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
e310: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
e320: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
e330: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
e340: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
e350: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
e360: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
e370: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
e380: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
e390: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
e3a0: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
e3b0: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
e3c0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
e3d0: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
e3e0: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
e3f0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
e400: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
e410: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
e420: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
e430: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
e440: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
e450: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
e460: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
e470: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
e480: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
e490: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
e4a0: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
e4b0: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
e4c0: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
e4d0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
e4e0: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
e4f0: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
e500: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
e510: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
e520: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
e530: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
e540: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
e550: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
e560: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
e570: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
e580: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
e590: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
e5a0: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
e5b0: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
e5c0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
e5d0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
e5e0: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
e5f0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
e600: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
e610: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
e620: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
e630: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
e640: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
e650: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
e660: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
e670: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
e680: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
e690: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
e6a0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
e6b0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
e6c0: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
e6d0: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
e6e0: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
e6f0: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
e700: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
e710: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
e720: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
e730: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
e740: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
e750: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
e760: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
e770: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
e780: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
e790: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
e7a0: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
e7b0: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
e7c0: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
e7d0: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
e7e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e7f0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
e800: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e810: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
e820: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
e830: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
e840: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
e850: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
e860: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
e870: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
e880: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
e890: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
e8a0: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
e8b0: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
e8c0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
e8d0: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
e8e0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e8f0: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
e900: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
e910: 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
e920: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
e930: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e940: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
e950: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
e960: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
e970: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
e980: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
e990: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
e9a0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
e9b0: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
e9c0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
e9d0: 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  ( noErr ){.     
e9e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65   sqlite3ErrorCle
e9f0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
ea00: 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  }.    goto exit_
ea10: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
ea20: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
ea30: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
ea40: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
ea50: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
ea60: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
ea70: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
ea80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
ea90: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
eaa0: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
eab0: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
eac0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
ead0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
eae0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
eaf0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
eb00: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
eb10: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
eb20: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
eb30: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
eb40: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
eb50: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
eb60: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
eb70: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
eb80: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
eb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
eba0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ebb0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
ebc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
ebd0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ebe0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
ebf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ec00: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
ec10: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
ec20: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
ec30: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
ec40: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
ec50: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
ec60: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
ec70: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
ec80: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
ec90: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
eca0: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
ecb0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
ecc0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
ecd0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ece0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
ecf0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
ed00: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
ed10: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
ed20: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
ed30: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
ed40: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
ed50: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
ed60: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c  Tab->readOnly ||
ed70: 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69   pTab==db->aDb[i
ed80: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db].pSchema->pSe
ed90: 71 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  qTab ){.    sqli
eda0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
edb0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
edc0: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
edd0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
ede0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
edf0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
ee00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ee10: 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
ee20: 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
ee30: 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
ee40: 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
ee50: 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
ee60: 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
ee70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
ee80: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
ee90: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
eea0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
eeb0: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
eec0: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
eed0: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
eee0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
eef0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
ef00: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
ef10: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
ef20: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
ef30: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ef40: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
ef50: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
ef60: 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
ef70: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
ef80: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ef90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
efa0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
efb0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
efc0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
efd0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
efe0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
eff0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f000: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f010: 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
f020: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
f030: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
f040: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
f050: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
f060: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
f070: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
f080: 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
f090: 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
f0a0: 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
f0b0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
f0c0: 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65  e.    ** is gene
f0d0: 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
f0e0: 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
f0f0: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
f100: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f  r.    ** sqlite_
f110: 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
f120: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f130: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
f140: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
f150: 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67     while( pTrigg
f160: 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
f170: 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
f180: 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
f190: 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
f1a0: 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
f1b0: 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
f1c0: 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
f1d0: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
f1e0: 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
f1f0: 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20  pTrigger);.     
f200: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
f210: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
f220: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
f230: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
f240: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d  EMENT.    /* Rem
f250: 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
f260: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
f270: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
f280: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
f290: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
f2a0: 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
f2b0: 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
f2c0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
f2d0: 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20  opped.    ** at 
f2e0: 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
f2f0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
f300: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
f310: 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  le needs to.    
f320: 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
f330: 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
f340: 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
f350: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
f360: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f370: 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29   pTab->autoInc )
f380: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
f390: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f3a0: 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
f3b0: 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
f3c0: 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
f3d0: 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
f3e0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
f3f0: 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
f400: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
f410: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
f420: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
f430: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
f440: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
f450: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
f460: 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
f470: 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
f480: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
f490: 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
f4a0: 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
f4b0: 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
f4c0: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
f4d0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
f4e0: 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
f4f0: 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
f500: 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
f510: 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
f520: 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
f530: 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
f540: 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
f550: 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
f560: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
f570: 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
f580: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
f590: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
f5a0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
f5b0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
f5c0: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
f5d0: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
f5e0: 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
f5f0: 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
f600: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
f610: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
f620: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
f630: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
f640: 20 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62        destroyTab
f650: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
f660: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f670: 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
f680: 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
f690: 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
f6a0: 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
f6b0: 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
f6c0: 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f  a cookie..    */
f6d0: 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
f6e0: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
f6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
f700: 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
f710: 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a   iDb, 0, pTab->z
f720: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
f730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f740: 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p3(v, OP_DropTab
f750: 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62  le, iDb, 0, pTab
f760: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
f770: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
f780: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
f790: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
f7a0: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
f7b0: 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
f7c0: 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
f7d0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
f7e0: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
f7f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f800: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
f810: 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
f820: 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
f830: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
f840: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
f850: 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
f860: 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
f870: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
f880: 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
f890: 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
f8a0: 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
f8b0: 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
f8c0: 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
f8d0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
f8e0: 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
f8f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
f900: 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
f910: 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
f920: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
f930: 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
f940: 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
f950: 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
f960: 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
f970: 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
f980: 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
f990: 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
f9a0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
f9b0: 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
f9c0: 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
f9d0: 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
f9e0: 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
f9f0: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
fa00: 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
fa10: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
fa20: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
fa30: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
fa40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
fa50: 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
fa60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
fa70: 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65  ld.  The new FKe
fa80: 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b  y.** is not link
fa90: 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65  ed into db->aFKe
faa0: 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
fab0: 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  - that does not 
fac0: 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20  happen.** until 
fad0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
fae0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  )..**.** The for
faf0: 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
fb00: 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
fb10: 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
fb20: 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
fb30: 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
fb40: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
fb50: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
fb60: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
fb70: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
fb80: 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
fb90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
fba0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
fbb0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
fbc0: 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
fbd0: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
fbe0: 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
fbf0: 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
fc00: 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
fc10: 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
fc20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
fc30: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
fc40: 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
fc50: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
fc60: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
fc70: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
fc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
fc90: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
fca0: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
fcb0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
fcc0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
fcd0: 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
fce0: 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
fcf0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
fd00: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
fd10: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
fd20: 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
fd30: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
fd40: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
fd50: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
fd60: 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  rr ) goto fk_end
fd70: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
fd80: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
fd90: 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
fda0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
fdb0: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
fdc0: 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
fdd0: 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
fde0: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
fdf0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fe00: 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
fe10: 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
fe20: 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
fe30: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
fe40: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
fe50: 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
fe60: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
fe70: 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
fe80: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
fe90: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
fea0: 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
feb0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
fec0: 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
fed0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
fee0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
fef0: 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
ff00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
ff10: 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
ff20: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
ff30: 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
ff40: 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
ff50: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
ff60: 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
ff70: 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
ff80: 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
ff90: 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
ffa0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
ffb0: 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73  *pFKey) + nCol*s
ffc0: 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
ffd0: 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
ffe0: 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
fff0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
10000 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
10010 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
10020 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
10030 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
10040 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
10050 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
10060 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
10070 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
10080 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
10090 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
100a0 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
100b0 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
100c0 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
100d0 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
100e0 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
100f0 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
10100 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
10110 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
10120 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
10130 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
10140 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
10150 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
10160 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
10170 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
10180 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
10190 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
101a0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
101b0 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
101c0 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
101d0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
101e0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
101f0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
10200 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
10210 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
10220 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
10230 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
10240 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
10250 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
10260 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
10270 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10280 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
10290 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
102a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
102b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
102c0 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
102d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
102e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
102f0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
10300 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
10310 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
10320 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
10330 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
10340 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
10350 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
10360 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
10370 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10380 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
10390 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
103a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
103b0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f  n = strlen(pToCo
103c0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
103d0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
103e0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
103f0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
10400 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
10410 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
10420 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
10430 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
10440 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
10450 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
10460 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
10470 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20  flags & 0xff;.  
10480 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
10490 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20  f = (flags >> 8 
104a0 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  ) & 0xff;.  pFKe
104b0 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
104c0 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
104d0 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e   0xff;..  /* Lin
104e0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
104f0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
10500 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
10510 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
10520 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
10530 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
10540 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
10550 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
10560 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10570 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
10580 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
10590 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f  rListDelete(pFro
105a0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
105b0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
105c0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
105d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
105e0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
105f0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
10600 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
10610 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
10620 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
10630 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
10640 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
10650 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
10660 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
10670 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
10680 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
10690 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
106a0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
106b0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
106c0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
106d0 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
106e0 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
106f0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
10700 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
10710 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
10720 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10730 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
10740 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10750 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
10760 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
10770 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
10780 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
10790 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
107a0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
107b0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
107c0 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
107d0 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
107e0 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
107f0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10800 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
10810 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
10820 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
10830 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
10840 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
10850 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
10860 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
10870 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
10880 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
10890 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
108a0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
108b0 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
108c0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
108d0 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
108e0 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
108f0 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
10900 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65  .  The memory ce
10910 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ll specified by 
10920 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
10930 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
10940 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
10950 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
10960 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
10970 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
10980 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
10990 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
109a0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
109b0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
109c0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
109d0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
109e0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
109f0 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
10a00 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
10a10 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
10a20 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
10a30 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
10a40 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
10a50 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
10a60 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
10a70 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
10a80 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
10a90 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
10aa0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
10ab0 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42  nTab;       /* B
10ac0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
10ad0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
10ae0 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
10af0 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a  ->nTab+1;     /*
10b00 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
10b10 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
10b20 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10b50 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
10b60 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
10b90 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
10ba0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
10bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
10bc0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
10bd0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
10be0 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
10bf0 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
10c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
10c10 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
10c20 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
10c30 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10c40 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  x(pParse->db, pI
10c50 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
10c60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10c70 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
10c80 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
10c90 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10ca0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
10cb0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
10cc0 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
10cd0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
10ce0 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
10cf0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
10d00 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
10d10 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
10d20 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
10d30 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
10d40 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
10d50 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
10d60 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
10d70 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
10d80 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
10d90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10da0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10db0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
10dc0 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
10dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10de0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
10df0 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
10e00 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
10e10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
10e20 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
10e30 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
10e40 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10e50 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
10e60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10e70 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10e80 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
10e90 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
10ea0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
10eb0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
10ec0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10ed0 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
10ee0 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63 68   iIdx, tnum, (ch
10ef0 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  ar *)pKey, P3_KE
10f00 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
10f10 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
10f20 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
10f30 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
10f40 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
10f50 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10f60 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
10f70 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73  d, iTab, 0);.  s
10f80 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
10f90 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
10fa0 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70  , iTab);.  if( p
10fb0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
10fc0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69  OE_None ){.    i
10fd0 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c  nt curaddr = sql
10fe0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10ff0 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  ddr(v);.    int 
11000 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b  addr2 = curaddr+
11010 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  4;.    sqlite3Vd
11020 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75  beChangeP2(v, cu
11030 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b  raddr-1, addr2);
11040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11050 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
11060 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
11070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11080 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
11090 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
110a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
110b0 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78  P_IsUnique, iIdx
110c0 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71  , addr2);.    sq
110d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
110e0 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
110f0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
11100 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  bort,.          
11110 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
11120 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
11130 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
11140 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65  TATIC);.    asse
11150 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74  rt( addr2==sqlit
11160 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
11170 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  r(v) );.  }.  sq
11180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11190 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
111a0 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iIdx, 0);.  sqli
111b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
111c0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
111d0 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
111e0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
111f0 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
11200 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11210 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20  OP_Close, iTab, 
11220 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
11230 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11240 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a  se, iIdx, 0);.}.
11250 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
11260 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
11270 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
11280 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
11290 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
112a0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
112b0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
112c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
112d0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
112e0 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
112f0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
11300 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11310 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
11320 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
11330 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
11340 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
11350 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
11360 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
11370 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
11380 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
11390 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
113a0 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
113b0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
113c0 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
113d0 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
113e0 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
113f0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
11400 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
11410 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
11420 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
11430 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
11440 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
11450 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
11460 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
11470 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
11480 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
11490 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
114a0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
114b0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
114c0 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
114d0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
114e0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
114f0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
11500 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
11510 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
11520 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
11530 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
11540 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
11550 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
11560 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
11570 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
11580 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
11590 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
115a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
115b0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
115c0 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
115d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
115e0 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
115f0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
11600 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
11610 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
11620 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
11630 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
11640 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
11650 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
11660 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
11670 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
11680 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
11690 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
116a0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
116b0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
116c0 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
116d0 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
116e0 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
116f0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11700 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
11710 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
11720 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
11730 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
11740 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
11750 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
11760 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
11770 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
11780 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
11790 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
117a0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
117b0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
117c0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
117d0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
117e0 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
117f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
11800 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
11810 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11820 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
11830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11840 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
11850 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
11860 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
11870 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
11880 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
11890 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
118a0 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
118b0 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
118c0 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
118d0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
118e0 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
118f0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
11900 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
11910 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
11920 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
11930 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11940 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
11950 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
11960 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
11970 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
11980 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
11990 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
119a0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
119b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
119c0 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
119d0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
119e0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
119f0 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
11a00 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
11a10 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
11a20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
11a30 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11a40 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
11a50 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11a60 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
11a70 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
11a80 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
11a90 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
11aa0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
11ab0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
11ac0 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
11ad0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11ae0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
11af0 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
11b00 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
11b10 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
11b20 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
11b30 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
11b40 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
11b50 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
11b60 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
11b70 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
11b80 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
11b90 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
11ba0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
11bb0 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
11bc0 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
11bd0 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
11be0 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
11bf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11c00 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
11c10 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
11c20 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
11c30 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
11c40 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
11c50 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
11c60 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
11c70 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
11c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11c90 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
11ca0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
11cb0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
11cc0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
11cd0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
11ce0 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
11cf0 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
11d00 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
11d10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61  ..    */.    pTa
11d20 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
11d30 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
11d40 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
11d50 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
11d60 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
11d70 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
11d80 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
11d90 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
11da0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   iDb = 1;.    }.
11db0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
11dc0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
11dd0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
11de0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
11df0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
11e00 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
11e10 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
11e20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
11e30 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
11e40 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
11e50 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
11e60 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
11e70 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
11e80 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
11e90 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
11ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
11eb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
11ec0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
11ed0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
11ee0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
11ef0 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
11f00 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
11f10 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
11f20 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
11f30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11f40 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
11f50 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
11f60 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
11f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11f80 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
11f90 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
11fa0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11fb0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
11fc0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11fd0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
11fe0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11ff0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
12000 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
12010 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
12020 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54  [iDb];..  if( pT
12030 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
12040 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
12050 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12060 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
12070 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
12080 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12090 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
120a0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
120b0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
120c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
120d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
120e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
120f0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
12100 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
12110 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12120 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
12130 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
12140 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
12150 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12160 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
12170 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
12180 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12190 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
121a0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
121b0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
121c0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
121d0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
121e0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
121f0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
12200 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
12210 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
12220 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
12230 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
12240 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12250 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
12260 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
12270 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
12280 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
12290 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
122a0 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
122b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
122c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
122d0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
122e0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
122f0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
12300 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
12310 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
12320 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
12330 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
12340 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
12350 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
12360 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
12370 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
12380 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
12390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
123a0 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
123b0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
123c0 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
123d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
123e0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
123f0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
12400 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12410 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
12420 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
12430 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12440 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12450 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
12460 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
12470 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
12480 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12490 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
124a0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
124b0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
124c0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
124d0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
124e0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
124f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12500 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ex;.      if( sq
12510 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
12520 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
12530 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
12540 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
12550 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
12560 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12570 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
12580 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
12590 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
125a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
125b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
125c0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
125d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
125e0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
125f0 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
12600 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12610 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
12620 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
12630 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
12640 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
12650 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12660 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12670 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
12680 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
12690 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
126a0 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
126b0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
126c0 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
126d0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
126e0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
126f0 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
12700 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
12710 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
12720 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
12730 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
12740 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
12750 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
12760 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
12770 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
12780 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12790 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
127a0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
127b0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
127c0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
127d0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
127e0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
127f0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
12800 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
12810 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  pDb->zName;.    
12820 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
12830 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
12840 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
12850 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
12860 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12870 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12880 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12890 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
128a0 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
128b0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
128c0 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
128d0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
128e0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
128f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12900 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
12910 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
12920 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12930 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12940 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12950 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
12960 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
12970 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
12980 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
12990 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
129a0 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
129b0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
129c0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
129d0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
129e0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
129f0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
12a00 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
12a10 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12a20 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
12a30 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54  llId.z = (u8*)pT
12a40 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
12a50 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
12a60 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
12a70 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  len((char*)nullI
12a80 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
12a90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12aa0 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e  tAppend(0, 0, &n
12ab0 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
12ac0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) 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 20 20 70 4c 69 73 74 2d 3e 61 5b  x;.    pList->a[
12af0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
12b00 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
12b10 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
12b20 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
12b30 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
12b40 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
12b50 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
12b60 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
12b70 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
12b80 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
12b90 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
12ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
12bb0 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
12bc0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12bd0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
12be0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
12bf0 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e  + strlen(pExpr->
12c00 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
12c10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12c20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
12c30 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
12c40 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
12c50 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
12c60 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
12c70 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
12c80 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
12c90 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  c( .      sizeof
12ca0 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20  (Index) +       
12cb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12cc0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
12cd0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
12ce0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
12cf0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
12d00 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  mn   */.      si
12d10 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b  zeof(int)*(nCol+
12d20 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e  1) +       /* In
12d30 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
12d40 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
12d50 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
12d60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
12d70 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
12d80 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
12d90 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
12da0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
12db0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d  er */.      nNam
12dc0 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
12dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12de0 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a  x.zName      */.
12df0 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20        nExtra    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
12e20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a  sequence names *
12e30 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  /.  );.  if( sql
12e40 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
12e50 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  () ) goto exit_c
12e60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
12e70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
12e80 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
12e90 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
12ea0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
12eb0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
12ec0 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
12ed0 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
12ee0 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
12ef0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
12f00 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
12f10 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12f20 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
12f30 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
12f40 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
12f50 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
12f60 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
12f70 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
12f80 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
12f90 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
12fa0 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70 79 28 70  +1]);.  strcpy(p
12fb0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
12fc0 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ame);.  pIndex->
12fd0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
12fe0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
12ff0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
13000 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
13010 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
13020 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
13030 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
13040 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
13050 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
13060 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68  Schema;..  /* Ch
13070 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
13080 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
13090 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
130a0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
130b0 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
130c0 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
130d0 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
130e0 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
130f0 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
13100 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
13110 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
13120 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
13130 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
13140 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
13150 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
13160 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
13170 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
13180 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
13190 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
131a0 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
131b0 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
131c0 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
131d0 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
131e0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
131f0 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
13200 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
13210 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
13220 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
13230 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13240 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
13250 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
13260 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
13270 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
13280 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
13290 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
132c0 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 66 6f  uence */..    fo
132d0 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
132e0 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
132f0 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
13300 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
13310 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
13320 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
13330 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
13340 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
13350 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
13360 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
13370 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13380 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
13390 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
133a0 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
133b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
133c0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  olName);.      g
133d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
133e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
133f0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
13400 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66  n[i] = j;.    if
13410 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
13420 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
13430 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
13440 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
13450 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
13460 74 72 61 3b 0a 20 20 20 20 20 20 73 74 72 63 70  tra;.      strcp
13470 79 28 7a 45 78 74 72 61 2c 20 70 4c 69 73 74 49  y(zExtra, pListI
13480 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
13490 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
134a0 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74 72 6c   zExtra += (strl
134b0 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a  en(zColl) + 1);.
134c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
134d0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
134e0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
134f0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
13500 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  {.        zColl 
13510 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d  = db->pDfltColl-
13520 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  >zName;.      }.
13530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
13540 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
13550 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
13560 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
13570 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  oll, -1) ){.    
13580 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13590 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
135a0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
135b0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
135c0 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
135d0 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
135e0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
135f0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
13600 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
13610 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73  rder[i] = reques
13620 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
13630 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
13640 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
13650 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  ;..  if( pTab==p
13660 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
13670 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
13680 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
13690 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
136a0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
136b0 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
136c0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
136d0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
136e0 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
136f0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
13700 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
13710 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
13720 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
13730 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
13740 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
13750 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
13760 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
13770 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
13780 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
13790 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
137a0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
137b0 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
137c0 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
137d0 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
137e0 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
137f0 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
13800 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
13810 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
13820 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
13830 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
13840 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
13850 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
13860 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
13870 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
13880 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
13890 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
138a0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
138b0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
138c0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
138d0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
138e0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
138f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
13900 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
13910 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
13920 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
13930 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
13940 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
13950 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
13960 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
13970 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
13980 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
13990 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
139a0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
139b0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
139c0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
139d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
139e0 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64  t char *z1 = pId
139f0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
13a00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13a10 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61   *z2 = pIndex->a
13a20 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
13a30 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
13a40 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
13a50 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
13a60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
13a70 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
13a80 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  er[k]!=pIndex->a
13a90 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62  SortOrder[k] ) b
13aa0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
13ab0 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
13ac0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
13ad0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
13ae0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
13af0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
13b00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
13b10 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
13b20 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
13b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
13b40 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
13b50 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
13b60 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
13b70 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
13b80 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
13b90 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
13ba0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
13bb0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
13bc0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
13bd0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
13be0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
13bf0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
13c00 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
13c10 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
13c20 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
13c30 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
13c40 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
13c50 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
13c60 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
13c70 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
13c80 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
13c90 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
13ca0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
13cb0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
13cc0 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
13cd0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
13ce0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
13cf0 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
13d00 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
13d10 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
13d20 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
13d30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13d40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13d50 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
13d60 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
13d70 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
13d80 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
13d90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
13da0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
13db0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
13dc0 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
13dd0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
13de0 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
13df0 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
13e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
13e10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
13e20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13e40 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
13e50 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
13e60 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
13e70 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
13e80 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
13e90 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
13ea0 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
13eb0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
13ec0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
13ed0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
13ee0 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
13ef0 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
13f00 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
13f30 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
13f40 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
13f50 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
13f60 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
13f70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
13f80 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
13f90 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f  iled */.      go
13fa0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13fb0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13fc0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
13fd0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
13fe0 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
13ff0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
14000 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
14010 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
14020 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14030 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
14040 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
14050 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
14060 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
14070 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
14080 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
14090 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
140a0 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
140b0 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
140c0 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
140d0 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
140e0 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
140f0 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
14100 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
14110 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
14120 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
14130 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
14140 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
14150 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
14160 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
14170 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
14180 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
14190 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
141a0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
141b0 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
141c0 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
141d0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
141e0 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
141f0 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
14200 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
14210 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
14220 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
14230 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
14240 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
14250 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
14260 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
14270 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
14280 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
14290 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
142a0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
142b0 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
142c0 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
142d0 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
142e0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
142f0 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
14300 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
14310 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
14320 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
14330 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
14340 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
14350 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
14360 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
14370 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
14380 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14390 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
143a0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
143b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
143c0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
143d0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
143e0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
143f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
14400 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
14410 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
14420 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14430 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
14440 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
14450 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14460 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
14470 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
14480 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
14490 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
144a0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
144b0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
144c0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
144d0 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
144e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
144f0 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
14500 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
14510 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
14520 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
14530 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
14540 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
14550 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
14560 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
14570 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
14580 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
14590 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
145a0 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a  .        pEnd->z
145b0 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c   - pName->z + 1,
145c0 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
145d0 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
145e0 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
145f0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
14600 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
14610 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
14620 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
14630 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
14640 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
14650 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
14660 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
14670 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
14680 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
14690 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
146a0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
146b0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
146c0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
146d0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
146e0 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
146f0 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c  ,%Q,%Q,#0,%Q);",
14700 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
14710 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
14720 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
14730 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
14740 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
14750 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
14760 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
14770 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14780 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
14790 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
147a0 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a  teFree(zStmt);..
147b0 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
147c0 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
147d0 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
147e0 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
147f0 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
14800 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
14810 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
14820 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
14830 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
14840 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
14850 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
14860 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
14870 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
14880 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
14890 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
148a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
148b0 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
148c0 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20  hema, iDb, 0,.  
148d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
148e0 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27  rintf("name='%q'
148f0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
14900 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
14910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14920 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70  eAddOp(v, OP_Exp
14930 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ire, 0, 0);.    
14940 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
14950 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
14960 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
14970 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
14980 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
14990 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
149a0 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
149b0 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
149c0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
149d0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
149e0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
149f0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
14a00 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
14a10 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
14a20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
14a30 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
14a40 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
14a50 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
14a60 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
14a70 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
14a80 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
14a90 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
14aa0 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
14ab0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
14ac0 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
14ad0 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
14ae0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
14af0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
14b00 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
14b10 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
14b20 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
14b30 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
14b40 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
14b50 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
14b60 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
14b70 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
14b80 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14b90 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
14ba0 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
14bb0 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
14bc0 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
14bd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
14be0 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
14bf0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
14c00 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
14c10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
14c20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
14c30 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
14c40 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
14c50 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
14c60 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  e(pList);.  sqli
14c70 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
14c80 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  (pTblName);.  sq
14c90 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
14ca0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
14cb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14cc0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
14cd0 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e  he file format n
14ce0 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65 61 73  umber is at leas
14cf0 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20  t minFormat..** 
14d00 54 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f  The generated co
14d10 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  de will increase
14d20 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
14d30 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63 65 73   number if neces
14d40 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sary..*/.void sq
14d50 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65  lite3MinimumFile
14d60 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a 70 50  Format(Parse *pP
14d70 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c 20 69  arse, int iDb, i
14d80 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20  nt minFormat){. 
14d90 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20   Vdbe *v;.  v = 
14da0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
14db0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
14dc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14dd0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
14de0 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  adCookie, iDb, 1
14df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14e00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
14e10 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
14e20 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14e30 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14e40 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56  _Ge, 0, sqlite3V
14e50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
14e60 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )+3);.    sqlite
14e70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14e80 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
14e90 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
14ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14eb0 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
14ec0 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Db, 1);.  }.}../
14ed0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
14ee0 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
14ef0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
14f00 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
14f10 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
14f20 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
14f30 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
14f40 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
14f50 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
14f60 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
14f70 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
14f80 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
14f90 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
14fa0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
14fb0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
14fc0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
14fd0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
14fe0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
14ff0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
15000 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
15010 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
15020 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
15030 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
15040 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
15050 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
15060 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
15070 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
15080 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
15090 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
150a0 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66   combiniation of
150b0 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
150c0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
150d0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
150e0 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
150f0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
15100 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
15110 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
15120 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
15130 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
15140 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
15150 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
15160 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
15170 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
15180 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
15190 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
151a0 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
151b0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
151c0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
151d0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
151e0 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
151f0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
15200 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
15210 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
15220 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
15230 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
15240 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d  igned *a = pIdx-
15250 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74  >aiRowEst;.  int
15260 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   i;.  assert( a!
15270 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31  =0 );.  a[0] = 1
15280 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d  000000;.  for(i=
15290 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
152a0 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61  >=5; i--){.    a
152b0 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77  [i] = 5;.  }.  w
152c0 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20  hile( i>=1 ){.  
152d0 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b    a[i] = 11 - i;
152e0 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20  .    i--;.  }.  
152f0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
15300 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
15310 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d    a[pIdx->nColum
15320 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n] = 1;.  }.}../
15330 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15340 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
15350 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
15360 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
15370 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
15380 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
15390 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
153a0 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
153b0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
153c0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
153d0 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
153e0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
153f0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
15400 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15410 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
15420 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
15430 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
15440 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
15450 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
15460 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
15470 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
15480 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
15490 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
154a0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
154b0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
154c0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
154d0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
154e0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
154f0 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
15500 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
15510 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
15520 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
15530 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
15540 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
15550 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15560 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
15570 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
15580 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
15590 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
155a0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
155b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
155c0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
155d0 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
155e0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
155f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15600 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
15610 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
15620 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
15630 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
15640 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
15650 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
15660 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15670 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
15680 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
15690 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
156a0 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
156b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
156c0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
156d0 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
156e0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
156f0 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
15700 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
15710 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
15720 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
15730 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
15740 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
15750 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
15760 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
15770 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15780 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15790 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
157a0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
157b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
157c0 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
157d0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
157e0 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
157f0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
15800 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
15810 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15820 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
15830 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
15840 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
15850 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
15860 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
15870 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
15880 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
15890 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
158a0 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
158b0 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
158c0 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
158d0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
158e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
158f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
15900 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15910 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
15920 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
15930 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
15940 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
15950 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
15960 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
15970 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
15980 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
15990 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
159a0 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65   v, iDb);.    de
159b0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
159c0 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
159d0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
159e0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
159f0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
15a00 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  b, 0, pIndex->zN
15a10 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
15a20 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
15a30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
15a40 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
15a50 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72 61 79 20 70  ./*.** ppArray p
15a60 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 73 74 72  oints into a str
15a70 75 63 74 75 72 65 20 77 68 65 72 65 20 74 68 65  ucture where the
15a80 72 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 70  re is an array p
15a90 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  ointer.** follow
15aa0 65 64 20 62 79 20 74 77 6f 20 69 6e 74 65 67 65  ed by two intege
15ab0 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e  rs. The first in
15ac0 74 65 67 65 72 20 69 73 20 74 68 65 0a 2a 2a 20  teger is the.** 
15ad0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
15ae0 74 73 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  ts in the struct
15af0 75 72 65 20 61 72 72 61 79 2e 20 20 54 68 65 20  ure array.  The 
15b00 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 0a 2a  second integer.*
15b10 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
15b20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  of allocated slo
15b30 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ts in the array.
15b40 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
15b50 77 6f 72 64 73 2c 20 74 68 65 20 73 74 72 75 63  words, the struc
15b60 74 75 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65 74  ture looks somet
15b70 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
15b80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 72  **.**        str
15b90 75 63 74 20 45 78 61 6d 70 6c 65 31 20 7b 0a 2a  uct Example1 {.*
15ba0 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  *          struc
15bb0 74 20 73 75 62 45 6c 65 6d 20 2a 61 45 6e 74 72  t subElem *aEntr
15bc0 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
15bd0 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  nt nEntry;.**   
15be0 20 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f         int nAllo
15bf0 63 3b 0a 2a 2a 20 20 20 20 20 20 20 20 7d 0a 2a  c;.**        }.*
15c00 2a 0a 2a 2a 20 54 68 65 20 70 6e 45 6e 74 72 79  *.** The pnEntry
15c10 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74   parameter point
15c20 73 20 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  s to the equival
15c30 65 6e 74 20 6f 66 20 45 78 61 6d 70 6c 65 31 2e  ent of Example1.
15c40 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  nEntry..**.** Th
15c50 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
15c60 61 74 65 73 20 61 20 6e 65 77 20 73 6c 6f 74 20  ates a new slot 
15c70 69 6e 20 74 68 65 20 61 72 72 61 79 2c 20 7a 65  in the array, ze
15c80 72 6f 73 20 69 74 20 6f 75 74 2c 0a 2a 2a 20 61  ros it out,.** a
15c90 6e 64 20 72 65 74 75 72 6e 73 20 69 74 73 20 69  nd returns its i
15ca0 6e 64 65 78 2e 20 20 49 66 20 6d 61 6c 6c 6f 63  ndex.  If malloc
15cb0 20 66 61 69 6c 73 20 61 20 6e 65 67 61 74 69 76   fails a negativ
15cc0 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e number is retu
15cd0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45 6e  rned..**.** szEn
15ce0 74 72 79 20 69 73 20 74 68 65 20 73 69 7a 65 6f  try is the sizeo
15cf0 66 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 61 72  f of a single ar
15d00 72 61 79 20 65 6e 74 72 79 2e 20 20 69 6e 69 74  ray entry.  init
15d10 53 69 7a 65 20 69 73 20 74 68 65 20 0a 2a 2a 20  Size is the .** 
15d20 6e 75 6d 62 65 72 20 6f 66 20 61 72 72 61 79 20  number of array 
15d30 65 6e 74 72 69 65 73 20 61 6c 6c 6f 63 61 74 65  entries allocate
15d40 64 20 6f 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  d on the initial
15d50 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   allocation..*/.
15d60 69 6e 74 20 73 71 6c 69 74 65 33 41 72 72 61 79  int sqlite3Array
15d70 41 6c 6c 6f 63 61 74 65 28 76 6f 69 64 20 2a 2a  Allocate(void **
15d80 70 70 41 72 72 61 79 2c 20 69 6e 74 20 73 7a 45  ppArray, int szE
15d90 6e 74 72 79 2c 20 69 6e 74 20 69 6e 69 74 53 69  ntry, int initSi
15da0 7a 65 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a  ze){.  char *p;.
15db0 20 20 69 6e 74 20 2a 61 6e 20 3d 20 28 69 6e 74    int *an = (int
15dc0 2a 29 26 70 70 41 72 72 61 79 5b 31 5d 3b 0a 20  *)&ppArray[1];. 
15dd0 20 69 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b 31   if( an[0]>=an[1
15de0 5d 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ] ){.    void *p
15df0 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77  New;.    int new
15e00 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a  Size;.    newSiz
15e10 65 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20 69 6e  e = an[1]*2 + in
15e20 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77  itSize;.    pNew
15e30 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
15e40 28 2a 70 70 41 72 72 61 79 2c 20 6e 65 77 53 69  (*ppArray, newSi
15e50 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  ze*szEntry);.   
15e60 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
15e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
15e80 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 5b 31 5d  .    }.    an[1]
15e90 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20   = newSize;.    
15ea0 2a 70 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b  *ppArray = pNew;
15eb0 0a 20 20 7d 0a 20 20 70 20 3d 20 2a 70 70 41 72  .  }.  p = *ppAr
15ec0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  ray;.  memset(&p
15ed0 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d 2c  [an[0]*szEntry],
15ee0 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
15ef0 72 65 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b 0a  return an[0]++;.
15f00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
15f10 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
15f20 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
15f30 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
15f40 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
15f50 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
15f60 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
15f70 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
15f80 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
15f90 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
15fa0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
15fb0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
15fc0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
15fd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15fe0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
15ff0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
16000 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
16010 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
16020 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
16030 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
16040 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
16050 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61   i = sqlite3Arra
16060 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a  yAllocate((void*
16070 2a 29 26 70 4c 69 73 74 2d 3e 61 2c 20 73 69 7a  *)&pList->a, siz
16080 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
16090 2c 20 35 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  , 5);.  if( i<0 
160a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
160b0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
160c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
160d0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
160e0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
160f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
16100 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
16110 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
16120 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
16130 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
16140 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
16150 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
16160 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
16170 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
16180 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16190 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
161a0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
161b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
161c0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
161d0 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
161e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
161f0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
16200 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
16210 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
16220 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
16230 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
16240 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
16250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
16260 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
16270 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
16280 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
16290 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
162a0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
162b0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
162c0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
162d0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
162e0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
162f0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
16300 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
16310 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
16320 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  1;.}../*.** Appe
16330 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
16340 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
16350 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
16360 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
16370 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
16380 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
16390 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
163a0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
163b0 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
163c0 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
163d0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
163e0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
163f0 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
16400 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
16410 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
16420 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
16430 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
16440 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
16450 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
16460 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
16470 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
16480 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
16490 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
164a0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
164b0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
164c0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
164d0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
164e0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
164f0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
16500 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
16510 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
16520 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
16530 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
16540 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
16550 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
16560 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
16570 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
16580 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
16590 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
165a0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
165b0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
165c0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
165d0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
165e0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
165f0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
16600 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
16610 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29  istAppend(A,B,0)
16620 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
16630 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
16640 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
16650 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
16660 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
16670 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
16680 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
16690 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
166a0 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,C);.**.** T
166b0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
166c0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
166d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
166e0 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
166f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
16700 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c  pend(SrcList *pL
16710 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  ist, Token *pTab
16720 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  le, Token *pData
16730 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20  base){.  struct 
16740 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
16750 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
16760 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
16770 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
16780 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
16790 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
167a0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
167b0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
167c0 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
167d0 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
167e0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
167f0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
16800 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
16810 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
16820 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
16830 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20  loc(pList,.     
16840 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
16850 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73  (*pList) + (pLis
16860 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  t->nAlloc-1)*siz
16870 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
16880 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
16890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
168a0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
168b0 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
168c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
168d0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
168e0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
168f0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
16900 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nSrc];.  memset
16910 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
16920 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
16930 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
16940 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
16950 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
16960 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
16970 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
16980 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54   pTable ){.    T
16990 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
169a0 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
169b0 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
169c0 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
169d0 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
169e0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
169f0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
16a00 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
16a10 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
16a20 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
16a30 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  n(pDatabase);.  
16a40 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
16a50 20 2d 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73   -1;.  pItem->is
16a60 50 6f 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20  Populated = 0;. 
16a70 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
16a80 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
16a90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
16aa0 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74  cursors to all t
16ab0 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
16ac0 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
16ad0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
16ae0 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
16af0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
16b00 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
16b10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
16b20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
16b30 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
16b40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
16b50 6c 65 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  led() );.  if( p
16b60 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
16b70 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
16b80 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
16b90 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
16ba0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
16bb0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
16bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
16bd0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
16be0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
16bf0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
16c00 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
16c10 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
16c20 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
16c30 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
16c40 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
16c50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16c60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
16c70 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
16c80 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
16c90 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
16ca0 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
16cb0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
16cc0 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73  tAddAlias(SrcLis
16cd0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
16ce0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
16cf0 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
16d00 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c  nSrc>0 ){.    pL
16d10 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
16d20 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  rc-1].zAlias = s
16d30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
16d40 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ken(pToken);.  }
16d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
16d60 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
16d70 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
16d80 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
16d90 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
16da0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
16db0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
16dc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
16dd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
16de0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
16df0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
16e00 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
16e10 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
16e20 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
16e30 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
16e40 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
16e50 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
16e60 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
16e70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
16e80 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
16e90 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c  zAlias);.    sql
16ea0 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
16eb0 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  0, pItem->pTab);
16ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
16ed0 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  ctDelete(pItem->
16ee0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
16ef0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
16f00 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
16f10 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
16f20 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  lete(pItem->pUsi
16f30 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
16f40 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
16f50 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
16f60 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
16f70 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
16f80 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
16f90 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
16fa0 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
16fb0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
16fc0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70   int i;..  if( p
16fd0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
16fe0 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
16ff0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
17000 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17010 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
17020 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
17030 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
17040 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
17050 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17060 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
17070 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
17080 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
17090 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
170a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
170b0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
170c0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
170d0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
170e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
170f0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
17100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17110 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
17120 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
17130 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
17140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
17150 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17160 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
17170 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
17180 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
17190 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
171a0 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
171b0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
171c0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
171d0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
171e0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
171f0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
17200 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
17210 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
17220 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
17230 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
17240 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
17250 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
17260 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
17270 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
17280 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
17290 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
172a0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
172b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
172c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
172d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
172e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
172f0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
17300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
17310 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
17320 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
17330 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
17340 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
17350 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
17360 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
17370 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
17380 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
17390 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
173a0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
173b0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
173c0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
173d0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
173e0 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d() ) return;.  
173f0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
17400 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
17410 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
17420 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
17430 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
17440 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
17450 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
17460 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
17470 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
17480 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
17490 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
174a0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
174b0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
174c0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
174d0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
174e0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
174f0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
17500 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
17510 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
17520 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
17530 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
17540 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
17550 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
17560 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17570 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
17580 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
17590 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
175a0 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
175b0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
175c0 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
175d0 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
175e0 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
175f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17610 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17620 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
17630 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
17640 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
17650 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
17660 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
17670 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
17680 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
17690 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
176a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
176b0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
176c0 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
176d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
176e0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
176f0 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
17700 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
17710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17720 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17730 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17740 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
17750 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
17760 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
17770 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
17780 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
17790 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
177a0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
177b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
177c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
177d0 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
177e0 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20  Schema );.  }.  
177f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
17800 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
17810 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
17820 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
17830 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
17840 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
17850 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
17860 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
17870 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
17880 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
17890 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
178a0 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
178b0 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
178c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
178d0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
178e0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
178f0 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
17900 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
17910 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
17920 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
17930 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
17940 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
17950 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
17960 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
17970 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
17980 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
17990 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
179a0 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
179b0 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
179c0 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
179d0 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
179e0 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
179f0 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
17a00 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
17a10 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
17a20 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
17a30 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
17a40 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
17a50 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
17a60 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
17a70 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
17a80 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
17a90 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
17aa0 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
17ab0 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
17ac0 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
17ad0 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
17ae0 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
17af0 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
17b00 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
17b10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
17b20 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
17b30 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
17b40 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
17b50 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
17b60 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
17b70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
17b80 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
17b90 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
17ba0 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
17bb0 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
17bc0 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
17bd0 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
17be0 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
17bf0 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
17c00 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
17c10 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
17c20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
17c30 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
17c40 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
17c50 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
17c60 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
17c70 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
17c80 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
17c90 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
17ca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
17cb0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
17cc0 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
17cd0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17ce0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
17cf0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
17d00 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
17d10 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
17d20 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
17d30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17d40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
17d50 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a  ookieGoto==0 ){.
17d60 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
17d70 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
17d80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17d90 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
17da0 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
17db0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
17dc0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
17dd0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
17de0 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
17df0 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
17e00 73 73 65 72 74 28 20 69 44 62 3c 4d 41 58 5f 41  ssert( iDb<MAX_A
17e10 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
17e20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
17e30 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
17e40 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
17e50 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
17e60 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
17e70 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
17e80 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
17e90 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
17ea0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
17eb0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
17ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
17ed0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
17ee0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
17ef0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
17f00 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
17f10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
17f30 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
17f40 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
17f50 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
17f60 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
17f70 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
17f80 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
17f90 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
17fa0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
17fb0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
17fc0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
17fd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
17fe0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
17ff0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
18000 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
18010 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
18020 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
18030 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
18040 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
18050 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
18060 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
18070 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
18080 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
18090 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
180a0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
180b0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
180c0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
180d0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
180e0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
180f0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
18100 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
18110 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
18120 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
18130 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
18140 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
18150 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
18160 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
18170 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
18180 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
18190 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
181a0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
181b0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
181c0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
181d0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
181e0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
181f0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
18200 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
18210 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
18220 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
18230 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
18240 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
18250 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
18260 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
18270 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
18280 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
18290 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
182a0 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
182b0 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
182c0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
182d0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
182e0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
182f0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
18300 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
18310 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
18320 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
18330 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
18340 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
18350 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18360 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
18370 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
18380 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
18390 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
183a0 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
183b0 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
183c0 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
183d0 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
183e0 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
183f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18400 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
18410 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
18420 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d  .  if( (OMIT_TEM
18430 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26  PDB || iDb!=1) &
18440 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
18450 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
18460 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
18470 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
18480 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
18490 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
184a0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
184b0 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
184c0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
184d0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
184e0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
184f0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
18500 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
18510 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
18520 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
18530 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
18540 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
18550 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
18560 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
18570 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
18580 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
18590 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
185a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
185b0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
185c0 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a  i];.    if( z==z
185d0 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43  Coll || (z && zC
185e0 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  oll && 0==sqlite
185f0 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
18600 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  l)) ){.      ret
18610 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
18620 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
18630 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
18640 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
18650 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
18660 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
18670 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
18680 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
18690 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
186a0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
186b0 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
186c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
186d0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
186e0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
186f0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
18700 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
18710 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
18720 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
18730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
18740 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
18750 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
18760 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
18770 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
18780 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
18790 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
187a0 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
187b0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
187c0 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
187d0 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
187e0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
187f0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
18800 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
18810 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
18820 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
18830 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
18840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
18850 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
18860 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
18870 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
18880 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
18890 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
188a0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
188b0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
188c0 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
188d0 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
188e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
188f0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
18900 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
18910 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
18920 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
18930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18940 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
18950 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
18960 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
18970 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
18980 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
18990 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
189a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
189b0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
189c0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
189f0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
18a00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
18a10 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
18a20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
18a30 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
18a40 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
18a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18a60 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
18a70 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
18a80 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18aa0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
18ab0 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f  atabase */..  fo
18ac0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
18ad0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
18ae0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
18af0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
18b00 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
18b10 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
18b20 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
18b30 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
18b40 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
18b50 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
18b60 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
18b70 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
18b80 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
18b90 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
18ba0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
18bb0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18bc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
18bd0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
18be0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
18bf0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
18c20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
18c30 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
18c40 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
18c50 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
18c60 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
18c70 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
18c80 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
18c90 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
18ca0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
18cb0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
18cc0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
18cd0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
18ce0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
18cf0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
18d00 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
18d10 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
18d20 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
18d30 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
18d40 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
18d50 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
18d60 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
18d70 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
18d80 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
18d90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
18da0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
18db0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18dc0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
18dd0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
18de0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
18df0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
18e00 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
18e10 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
18e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18e30 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
18e40 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
18e50 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
18e60 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e80 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
18e90 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
18ea0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
18eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
18ec0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
18ed0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
18ee0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
18ef0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
18f00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
18f10 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
18f20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
18f30 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
18f40 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
18f50 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
18f80 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
18f90 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
18fa0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
18fb0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
18fc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
18fd0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18ff0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
19000 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
19010 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
19020 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
19030 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
19040 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
19050 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
19060 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
19070 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
19080 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
19090 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
190a0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
190b0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
190c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
190d0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
190e0 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d  =0 || pName1->z=
190f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
19100 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
19110 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
19120 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
19130 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name2==0 || pNam
19140 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
19150 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
19160 7a 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  z );.    pColl =
19170 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
19180 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
19190 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 31 2d 3e   (char*)pName1->
191a0 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29  z, pName1->n, 0)
191b0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
191c0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
191d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  Coll = sqliteStr
191e0 4e 44 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72  NDup((const char
191f0 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e   *)pName1->z, pN
19200 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  ame1->n);.      
19210 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( zColl ){.   
19220 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
19230 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
19240 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  oll);.        sq
19250 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 6c 29 3b  liteFree(zColl);
19260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19270 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
19280 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
19290 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
192a0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
192b0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
192c0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
192d0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
192e0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
192f0 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44  (pObjName);.  zD
19300 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
19310 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
19320 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
19330 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
19340 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
19350 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
19360 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
19370 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
19380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
19390 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
193a0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
193b0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
193c0 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69  liteFree(z);.  i
193d0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
193e0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
193f0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
19400 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
19410 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
19420 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
19430 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
19440 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
19450 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19460 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
19470 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
19480 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
19490 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
194a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
194b0 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
194c0 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
194d0 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
194e0 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
194f0 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
19500 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
19510 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
19520 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
19530 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
19540 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
19550 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
19560 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
19570 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
19580 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
19590 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
195a0 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e 20 74  qliteFree() on t
195b0 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
195c0 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
195d0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
195e0 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
195f0 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
19600 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
19610 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
19620 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
19630 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
19640 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
19650 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
19660 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
19670 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
19680 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
19690 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
196a0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
196b0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
196c0 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
196d0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f  (KeyInfo) + (nCo
196e0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  l-1)*sizeof(Coll
196f0 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20  Seq*) + nCol;.  
19700 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
19710 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74  (KeyInfo *)sqlit
19720 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b  eMalloc(nBytes);
19730 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
19740 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
19750 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70  rder = (u8 *)&(p
19760 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d  Key->aColl[nCol]
19770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  );.    assert( &
19780 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
19790 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a  [nCol]==&(((u8 *
197a0 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20  )pKey)[nBytes]) 
197b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
197c0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
197d0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
197e0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
197f0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
19800 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20   zColl );.      
19810 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
19820 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
19830 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
19840 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  oll, -1);.      
19850 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
19860 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
19870 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
19880 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
19890 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20  d = nCol;.  }.. 
198a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
198b0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  r ){.    sqliteF
198c0 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 70  ree(pKey);.    p
198d0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
198e0 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a        eturn pKey;.}.