/ Hex Artifact Content
Login

Artifact 59fd5782a728686148a6d30a5df283c177d22c1f:


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 33 33 20 32 30 30 37 2f 30 37 2f 30 32  1.433 2007/07/02
02f0: 20 31 39 3a 33 31 3a 32 37 20 64 72 68 20 45 78   19:31:27 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 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
0a30: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ock = sqliteReal
0a40: 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
0a50: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42  ->aTableLock, nB
0a60: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70 50 61  ytes);.  if( pPa
0a70: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  rse->aTableLock 
0a80: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  ){.    p = &pPar
0a90: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70  se->aTableLock[p
0aa0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
0ab0: 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62  k++];.    p->iDb
0ac0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69   = iDb;.    p->i
0ad0: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
0ae0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
0af0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
0b00: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61    p->zName = zNa
0b10: 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  me;.  }.}../*.**
0b20: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c   Code an OP_Tabl
0b30: 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69 6f  eLock instructio
0b40: 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
0b50: 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a 2a   locked by the.*
0b60: 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e  * statement (con
0b70: 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c 73  figured by calls
0b80: 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c 65   to sqlite3Table
0b90: 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  Lock())..*/.stat
0ba0: 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62 6c  ic void codeTabl
0bb0: 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70 50  eLocks(Parse *pP
0bc0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
0bd0: 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 0a    Vdbe *pVdbe; .
0be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0bf0: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
0c00: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
0c10: 44 61 74 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Data || pParse->
0c20: 6e 54 61 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  nTableLock==0 );
0c30: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62  ..  if( 0==(pVdb
0c40: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0c50: 62 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20  be(pParse)) ){. 
0c60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0c80: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
0ca0: 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73  Lock *p = &pPars
0cb0: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0cc0: 3b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70  ;.    int p1 = p
0cd0: 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66 28 20 70  ->iDb;.    if( p
0ce0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b  ->isWriteLock ){
0cf0: 0a 20 20 20 20 20 20 70 31 20 3d 20 2d 31 2a 28  .      p1 = -1*(
0d00: 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p1+1);.    }.   
0d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0d20: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0d30: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0d40: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
0d50: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0d60: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0d70: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0d80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0d90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0da0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e  lled after a sin
0db0: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0dc0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61  t has been.** pa
0dd0: 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20  rsed and a VDBE 
0de0: 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
0df0: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
0e00: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72  t has been.** pr
0e10: 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f  epared.  This ro
0e20: 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66  utine puts the f
0e30: 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73  inishing touches
0e40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   on the.** VDBE 
0e50: 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65  program and rese
0e60: 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74  ts the pParse st
0e70: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
0e80: 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a  next.** parse..*
0e90: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
0ea0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
0eb0: 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65  red, it might be
0ec0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
0ed0: 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77  * no VDBE code w
0ee0: 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  as generated..*/
0ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
0f00: 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20  ishCoding(Parse 
0f10: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
0f20: 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
0f30: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
0f40: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0f50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f60: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0f70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f80: 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29  !pParse->pVdbe )
0f90: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
0fa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
0fb0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  && pParse->nErr 
0fc0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0fd0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
0fe0: 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OR;.      return
0ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1000: 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72  * Begin by gener
1010: 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69  ating some termi
1020: 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74  nation code at t
1030: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
1040: 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a  ** vdbe program.
1050: 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
1060: 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
1070: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1080: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74  AddOp(v, OP_Halt
10b0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
10c0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10d0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10e0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
10f0: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1100: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1110: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1120: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1130: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1140: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1150: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1160: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1170: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1180: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
1190: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11a0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11b0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11c0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11d0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11e0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
11f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1200: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1210: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1220: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1230: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1240: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1250: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
1260: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
1270: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
1280: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
1290: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
12a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
12b0: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
12c0: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
12d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f0: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
1300: 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73  ction, iDb, (mas
1310: 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74  k & pParse->writ
1320: 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20  eMask)!=0);.    
1330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1340: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
1350: 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50  yCookie, iDb, pP
1360: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
1370: 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d  e[iDb]);.      }
1380: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1390: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13a0: 45 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  E.      if( pPar
13b0: 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b  se->pVirtualLock
13c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
13d0: 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a   *vtab = (char *
13e0: 29 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61  )pParse->pVirtua
13f0: 6c 4c 6f 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20  lLock->pVtab;.  
1400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1410: 65 4f 70 33 28 76 2c 20 4f 50 5f 56 42 65 67 69  eOp3(v, OP_VBegi
1420: 6e 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  n, 0, 0, vtab, P
1430: 33 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  3_VTAB);.      }
1440: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1450: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1460: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1470: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1480: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1490: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
14a0: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
14b0: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
14c0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
14d0: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
14e0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
14f0: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
1500: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1510: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
1520: 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  s(pParse);.     
1530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1540: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
1550: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1560: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  oto);.    }..#if
1570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1580: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64  _TRACE.    /* Ad
1590: 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63  d a No-op that c
15a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70  ontains the comp
15b0: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
15c0: 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20   compiled SQL.  
15d0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
15e0: 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e  s its P3 argumen
15f0: 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f  t.  This does no
1600: 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e  t change the fun
1610: 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a  ctionality.    *
1620: 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  * of the program
1630: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
1640: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1650: 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
1660: 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20  e3_trace()..    
1670: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1680: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70  beOp3(v, OP_Noop
1690: 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  , 0, 0, pParse->
16a0: 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54  zSql, pParse->zT
16b0: 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c  ail-pParse->zSql
16c0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16d0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
16e0: 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74  /.  }...  /* Get
16f0: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1700: 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63  m ready for exec
1710: 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28  ution.  */.  if(
1720: 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45   v && pParse->nE
1730: 72 72 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rr==0 && !sqlite
1740: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
1750: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1760: 5f 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20  _DEBUG.    FILE 
1770: 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c  *trace = (db->fl
1780: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1790: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
17a0: 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c  out : 0;.    sql
17b0: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c  ite3VdbeTrace(v,
17c0: 20 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a   trace);.#endif.
17d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
17e0: 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72  akeReady(v, pPar
17f0: 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65  se->nVar, pParse
1800: 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20  ->nMem+3,.      
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b     pParse->nTab+
1830: 33 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  3, pParse->expla
1840: 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  in);.    pParse-
1850: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e  >rc = SQLITE_DON
1860: 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  E;.    pParse->c
1870: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a  olNamesSet = 0;.
1880: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1890: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
18a0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  K ){.    pParse-
18b0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
18c0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
18d0: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
18e0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
18f0: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1900: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1910: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1920: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1930: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1940: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1950: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1960: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1970: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1980: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1990: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
19a0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
19b0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
19c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19d0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
19e0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
19f0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1a00: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1a10: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1a20: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1a30: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1a40: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1a50: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1a60: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1a70: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1a80: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1a90: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1aa0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1ab0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1ac0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1ad0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1ae0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1af0: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1b00: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1b10: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1b20: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1b30: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1b40: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1b50: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1b60: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1b70: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1b80: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1b90: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1ba0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1bb0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1bc0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1bd0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1be0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1bf0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1c00: 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a  # define SAVE_SZ
1c10: 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29    (sizeof(Parse)
1c20: 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73   - offsetof(Pars
1c30: 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20  e,nVar)).  char 
1c40: 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d  saveBuf[SAVE_SZ]
1c50: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
1c60: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1c70: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1c80: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
1c90: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
1ca0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
1cb0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
1cc0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1cd0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
1ce0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
1cf0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1d00: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
1d10: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
1d20: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
1d30: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
1d40: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
1d50: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
1d60: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
1d70: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
1d80: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
1d90: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
1da0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
1db0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
1dc0: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
1dd0: 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ql, 0);.  sqlite
1de0: 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65  Free(zSql);.  me
1df0: 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56  mcpy(&pParse->nV
1e00: 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56  ar, saveBuf, SAV
1e10: 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d  E_SZ);.  pParse-
1e20: 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a  >nested--;.}../*
1e30: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1e40: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1e50: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1e60: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
1e70: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
1e80: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
1e90: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
1ea0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
1eb0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1ec0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
1ed0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
1ee0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1ef0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
1f00: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
1f10: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1f20: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1f30: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
1f40: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
1f50: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
1f60: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1f70: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
1f80: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
1f90: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1fa0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1fb0: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
1fc0: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
1fd0: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
1fe0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
1ff0: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
2000: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
2010: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
2020: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
2030: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2040: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
2050: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2060: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2070: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73  t char *zDatabas
2080: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  e){.  Table *p =
2090: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61   0;.  int i;.  a
20a0: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
20b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
20c0: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
20d0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
20e0: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
20f0: 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63   : i;   /* Searc
2100: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
2110: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
2120: 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71  atabase!=0 && sq
2130: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61  lite3StrICmp(zDa
2140: 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b  tabase, db->aDb[
2150: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
2160: 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71  inue;.    p = sq
2170: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2180: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2190: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
21a0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
21b0: 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  +1);.    if( p )
21c0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
21d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
21e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
21f0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2200: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2210: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2220: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2230: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2240: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2250: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2260: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2270: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2280: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2290: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
22a0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
22b0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
22c0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
22d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
22e0: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
22f0: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2300: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2310: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2320: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2330: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2340: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2350: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2360: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2370: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2380: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2390: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
23a0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
23b0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
23c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
23d0: 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54 61 62   *zDbase){.  Tab
23e0: 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61  le *p;..  /* Rea
23f0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2400: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
2410: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
2420: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2430: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
2440: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
2450: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
2460: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
2470: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
2480: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
2490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
24a0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
24b0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
24c0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
24d0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
24e0: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
24f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2500: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2510: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
2520: 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20  %s.%s", zDbase, 
2530: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
2540: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2550: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2560: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
2570: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
2580: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
2590: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
25a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
25c0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
25d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
25e0: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
25f0: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
2600: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2610: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
2620: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
2630: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
2640: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
2650: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
2660: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2670: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
2680: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
2690: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
26a0: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
26b0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
26c0: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e  irst matching in
26d0: 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dex is returned.
26e0: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
26f0: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
2700: 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64  index names is d
2710: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
2720: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
2730: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2740: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
2750: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2760: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
2770: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2780: 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  and..*/.Index *s
2790: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
27a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
27b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
27c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
27d0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30  {.  Index *p = 0
27e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
27f0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2800: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2810: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2820: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
2830: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2840: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2850: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2860: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2870: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a  chema;.    if( z
2880: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
2890: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
28a0: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
28b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
28c0: 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28  rt( pSchema || (
28d0: 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62  j==1 && !db->aDb
28e0: 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20  [1].pBt) );.    
28f0: 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20  if( pSchema ){. 
2900: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
2910: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
2920: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
2930: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
2940: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +1);.    }.    i
2950: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
2960: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2970: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
2980: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
2990: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74  y an index.*/.st
29a0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e  atic void freeIn
29b0: 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20  dex(Index *p){. 
29c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a   sqliteFree(p->z
29d0: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
29e0: 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(p);.}../*.
29f0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69  ** Remove the gi
2a00: 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74  ven index from t
2a10: 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61  he index hash ta
2a20: 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a  ble, and free.**
2a30: 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75   its memory stru
2a40: 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctures..**.** Th
2a50: 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76  e index is remov
2a60: 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
2a70: 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  base hash tables
2a80: 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f   but.** it is no
2a90: 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20  t unlinked from 
2aa0: 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69  the Table that i
2ab0: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e  t indexes..** Un
2ac0: 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65  linking from the
2ad0: 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64   Table must be d
2ae0: 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69  one by the calli
2af0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
2b00: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2b10: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e  teDeleteIndex(In
2b20: 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78  dex *p){.  Index
2b30: 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20   *pOld;.  const 
2b40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d  char *zName = p-
2b50: 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20  >zName;..  pOld 
2b60: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
2b70: 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
2b80: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2b90: 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b   strlen( zName)+
2ba0: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
2bb0: 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64   pOld==0 || pOld
2bc0: 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64  ==p );.  freeInd
2bd0: 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ex(p);.}../*.** 
2be0: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
2bf0: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
2c00: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
2c10: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
2c20: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
2c30: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
2c40: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
2c50: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
2c60: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
2c70: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
2c80: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
2c90: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
2ca0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
2cb0: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
2cc0: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
2cd0: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
2ce0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
2cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
2d00: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
2d10: 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65  pIndex;.  int le
2d20: 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  n;.  Hash *pHash
2d30: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
2d40: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
2d50: 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  h;..  len = strl
2d60: 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20  en(zIdxName);.  
2d70: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
2d80: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
2d90: 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b  , zIdxName, len+
2da0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e  1, 0);.  if( pIn
2db0: 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70  dex ){.    if( p
2dc0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
2dd0: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
2de0: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
2df0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
2e00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
2e10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e20: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
2e30: 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54  for(p=pIndex->pT
2e40: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20  able->pIndex; p 
2e50: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
2e60: 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  dex; p=p->pNext)
2e70: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26  {}.      if( p &
2e80: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
2e90: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ex ){.        p-
2ea0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
2eb0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
2ec0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
2ed0: 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
2ee0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
2ef0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2f00: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  nges;.}../*.** E
2f10: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
2f20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
2f30: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
2f40: 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a  ash tables of.**
2f50: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
2f60: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2f70: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
2f80: 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a  eclaim memory.**
2f90: 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61   before the data
2fa0: 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74  base closes.  It
2fb0: 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20   is also called 
2fc0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
2fd0: 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65  k.** if there we
2fe0: 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  re schema change
2ff0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
3000: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61  nsaction or if a
3010: 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69  .** schema-cooki
3020: 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72  e mismatch occur
3030: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  s..**.** If iDb<
3040: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
3050: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
3060: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
3070: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
3080: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74  es.  If iDb>=2 t
3090: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
30a0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
30b0: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
30c0: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
30d0: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
30e0: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
30f0: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20  lSchema(sqlite3 
3100: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
3110: 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73   int i, j;..  as
3120: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3130: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
3140: 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62   for(i=iDb; i<db
3150: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3160: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
3170: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
3180: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pDb->pSchema ){.
3190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
31a0: 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63  emaFree(pDb->pSc
31b0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
31c0: 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74   if( iDb>0 ) ret
31d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
31e0: 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64  t( iDb==0 );.  d
31f0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3200: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3210: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
3220: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61  or more of the a
3230: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
3240: 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e  e files has been
3250: 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68   closed,.  ** th
3260: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  en remove them f
3270: 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72  rom the auxiliar
3280: 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e  y database list.
3290: 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20    We take the.  
32a0: 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  ** opportunity t
32b0: 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73  o do this here s
32c0: 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73  ince we have jus
32d0: 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66  t deleted all of
32e0: 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61   the.  ** schema
32f0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
3300: 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f   therefore do no
3310: 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61  t have to make a
3320: 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ny changes.  ** 
3330: 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  to any of those 
3340: 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
3360: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
3370: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
3380: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3390: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
33a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  {.      if( pDb-
33b0: 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46  >pAux && pDb->xF
33c0: 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46  reeAux ) pDb->xF
33d0: 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78  reeAux(pDb->pAux
33e0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41  );.      pDb->pA
33f0: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
3400: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  }.  for(i=j=2; i
3410: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3420: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
3430: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3440: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3450: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3460: 71 6c 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a  qliteFree(pDb->z
3470: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62  Name);.      pDb
3480: 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ->zName = 0;.   
3490: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
34a0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29   }.    if( j<i )
34b0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  {.      db->aDb[
34c0: 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b  j] = db->aDb[i];
34d0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
34e0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62    }.  memset(&db
34f0: 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62  ->aDb[j], 0, (db
3500: 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28  ->nDb-j)*sizeof(
3510: 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20  db->aDb[j]));.  
3520: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
3530: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
3540: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
3550: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
3560: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
3570: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
3580: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
3590: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ]));.    sqliteF
35a0: 72 65 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20  ree(db->aDb);.  
35b0: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
35c0: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d  aDbStatic;.  }.}
35d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
35e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
35f0: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
3600: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
3610: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
3620: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
3630: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
3640: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3650: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3660: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
3670: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
3680: 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  om a table or vi
3690: 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ew..*/.static vo
36a0: 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  id sqliteResetCo
36b0: 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20  lumnNames(Table 
36c0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
36d0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
36e0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
36f0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
3700: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
3710: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
3720: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
3730: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
3740: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
3750: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e  iteFree(pCol->zN
3760: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3770: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43  te3ExprDelete(pC
3780: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
3790: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
37a0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  l->zType);.     
37b0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
37c0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
37d0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
37e0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
37f0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  }.  pTable->aCol
3800: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
3810: 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nCol = 0;.}../*.
3820: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
3830: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
3840: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
3850: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
3860: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
3870: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
3880: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
3890: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
38a0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
38b0: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
38c0: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
38d0: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
38e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
38f0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
3900: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
3910: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
3920: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
3930: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
3940: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
3950: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
3960: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
3970: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3980: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
3990: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
39a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
39b0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
39c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
39d0: 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20  leteTable(Table 
39e0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
39f0: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3a00: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
3a10: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20  , *pNextFKey;.. 
3a20: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
3a30: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44   return;..  /* D
3a40: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
3a50: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
3a60: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3a70: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3a80: 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  /.  pTable->nRef
3a90: 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  --;.  if( pTable
3aa0: 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
3ab0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3ac0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52  sert( pTable->nR
3ad0: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  ef==0 );..  /* D
3ae0: 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  elete all indice
3af0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3b00: 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a  h this table.  *
3b10: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
3b20: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
3b30: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
3b40: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
3b50: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3b60: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
3b70: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
3b80: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
3b90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
3ba0: 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  eteIndex(pIndex)
3bb0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
3bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
3bd0: 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65  GN_KEY.  /* Dele
3be0: 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b  te all foreign k
3bf0: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
3c00: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
3c10: 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73   The keys.  ** s
3c20: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
3c30: 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  dy been unlinked
3c40: 20 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d   from the pSchem
3c50: 61 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61  a->aFKey hash ta
3c60: 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble .  */.  for(
3c70: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
3c80: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
3c90: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
3ca0: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
3cb0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
3cc0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3cd0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61  te3HashFind(&pTa
3ce0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  ble->pSchema->aF
3cf0: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c  pFKey->zTo, strl
3d20: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31  en(pFKey->zTo)+1
3d30: 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20  )!=pFKey );.    
3d40: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
3d50: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
3d60: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
3d70: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
3d80: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
3d90: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3da0: 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20  ames(pTable);.  
3db0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3dc0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
3dd0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
3de0: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
3df0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3e00: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
3e10: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3e20: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71  _OMIT_CHECK.  sq
3e30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3e40: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
3e50: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3e60: 33 56 74 61 62 43 6c 65 61 72 28 70 54 61 62 6c  3VtabClear(pTabl
3e70: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3e80: 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pTable);.}../*.
3e90: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69  ** Unlink the gi
3ea0: 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  ven table from t
3eb0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  he hash tables a
3ec0: 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68  nd the delete th
3ed0: 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63  e.** table struc
3ee0: 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74  ture with all it
3ef0: 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  s indices and fo
3f00: 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76  reign keys..*/.v
3f10: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  oid sqlite3Unlin
3f20: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
3f30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
3f40: 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   iDb, const char
3f50: 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54   *zTabName){.  T
3f60: 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20  able *p;.  FKey 
3f70: 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62  *pF1, *pF2;.  Db
3f80: 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
3f90: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
3fa0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
3fb0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
3fc0: 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65  assert( zTabName
3fd0: 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20   && zTabName[0] 
3fe0: 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
3ff0: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
4000: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4010: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
4020: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
4030: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e  me, strlen(zTabN
4040: 61 6d 65 29 2b 31 2c 30 29 3b 0a 20 20 69 66 28  ame)+1,0);.  if(
4050: 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   p ){.#ifndef SQ
4060: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
4070: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
4080: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
4090: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
40a0: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
40b0: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31  nTo = strlen(pF1
40c0: 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20  ->zTo) + 1;.    
40d0: 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33 48    pF2 = sqlite3H
40e0: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 70 53  ashFind(&pDb->pS
40f0: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
4100: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  1->zTo, nTo);.  
4110: 20 20 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31      if( pF2==pF1
4120: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4130: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
4140: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  Db->pSchema->aFK
4150: 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54  ey, pF1->zTo, nT
4160: 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29  o, pF1->pNextTo)
4170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4180: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
4190: 32 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54  2 && pF2->pNextT
41a0: 6f 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46  o!=pF1 ){ pF2=pF
41b0: 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20  2->pNextTo; }.  
41c0: 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b        if( pF2 ){
41d0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e  .          pF2->
41e0: 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70  pNextTo = pF1->p
41f0: 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20  NextTo;.        
4200: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4210: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
4220: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 29  e3DeleteTable(p)
4230: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
4240: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
4250: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
4260: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
4270: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
4280: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
4290: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
42a0: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69  that.** token wi
42b0: 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e  th any quotation
42c0: 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63  s removed.  Spac
42d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
42e0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
42f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
4300: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
4310: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
4320: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
4330: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
4340: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4350: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4360: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4370: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
4380: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
4390: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
43a0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
43b0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
43c0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
43d0: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
43e0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
43f0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4400: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4410: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d  oken(Token *pNam
4420: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
4430: 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  e;.  if( pName )
4440: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
4450: 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61  liteStrNDup((cha
4460: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
4470: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
4480: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
4490: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
44a0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
44b0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
44c0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
44d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
44e0: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
44f0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
4500: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
4510: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
4520: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
4530: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
4540: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
4550: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
4560: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
4570: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
4580: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
4590: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
45a0: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
45b0: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
45c0: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
45d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
45e0: 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
45f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4600: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
4610: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
4620: 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65  _ROOT);.  sqlite
4630: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4640: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
4650: 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65  0, 5); /* sqlite
4660: 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63 6f  _master has 5 co
4670: 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  lumns */.}../*.*
4680: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
4690: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
46a0: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
46b0: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
46c0: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
46d0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
46e0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
46f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
4700: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
4710: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
4720: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
4730: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
4740: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
4750: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
4760: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
4770: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
4780: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4790: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
47a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
47b0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ber */.  int n; 
47c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
47d0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
47e0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  in the name */. 
47f0: 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
4800: 2f 2a 20 41 20 64 61 74 61 62 61 73 65 20 77 68  /* A database wh
4810: 6f 73 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69  ose name space i
4820: 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
4830: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
4840: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20  e;   /* Name we 
4850: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
4860: 72 20 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20  r */..  zName = 
4870: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4880: 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69  oken(pName);.  i
4890: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
48a0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
48b0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  );.    for(i=(db
48c0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
48d0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
48e0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
48f0: 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54      if( (!OMIT_T
4900: 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20  EMPDB || i!=1 ) 
4910: 26 26 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62  && n==strlen(pDb
4920: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
4930: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
4940: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
4950: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
4960: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4980: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
4990: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
49a0: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
49b0: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
49c0: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
49d0: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
49e0: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
49f0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
4a00: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
4a10: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
4a20: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
4a30: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
4a40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
4a50: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
4a60: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
4a70: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
4a80: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
4a90: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
4aa0: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
4ab0: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
4ac0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4ad0: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
4ae0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4af0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
4b00: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4b10: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
4b20: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
4b30: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
4b40: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
4b50: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
4b60: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
4b70: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
4b80: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
4b90: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
4ba0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
4bb0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
4bc0: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
4bd0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
4be0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
4bf0: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4c00: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
4c10: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
4c20: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
4c30: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
4c40: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
4c50: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
4c60: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
4c70: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
4c80: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
4c90: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
4ca0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
4cb0: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
4cc0: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
4cd0: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
4ce0: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
4cf0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
4d00: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
4d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4d20: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
4d30: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
4d40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4d50: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
4d60: 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d  Name2 && pName2-
4d70: 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  >n>0 ){.    asse
4d80: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
4d90: 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75  sy );.    *pUnqu
4da0: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
4db0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
4dc0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
4dd0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
4de0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4df0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4e00: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
4e10: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
4e20: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
4e30: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
4e40: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
4e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4e60: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
4e70: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
4e80: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
4e90: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
4ea0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
4eb0: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
4ec0: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
4ed0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4ee0: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
4ef0: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
4f00: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
4f10: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
4f20: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
4f30: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
4f40: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
4f50: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
4f60: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
4f70: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
4f80: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
4f90: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
4fa0: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
4fb0: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
4fc0: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
4fd0: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
4fe0: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
4ff0: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
5000: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
5010: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
5020: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
5030: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
5040: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5050: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
5060: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
5070: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
5080: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
5090: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
50a0: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
50b0: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
50c0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
50d0: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
50e0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
50f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5100: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
5110: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
5120: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5130: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
5140: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
5150: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5170: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  OK;.}../*.** Beg
5180: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
5190: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
51a0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
51b0: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
51c0: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
51d0: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
51e0: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
51f0: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
5200: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
5210: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5220: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
5230: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
5240: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
5250: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
5260: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
5270: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
5280: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
5290: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
52a0: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
52b0: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
52c0: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
52d0: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
52e0: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
52f0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
5300: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
5310: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
5320: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
5330: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
5340: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
5350: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
5360: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
5370: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
5380: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
5390: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
53a0: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
53b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
53c0: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
53d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
53e0: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
53f0: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
5400: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
5410: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
5420: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
5430: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
5440: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
5450: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
5460: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5470: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
5480: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
5490: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
54a0: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
54b0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
54c0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
54d0: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
54e0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
54f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5500: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
5510: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
5520: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
5530: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
5540: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5550: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
5560: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
5570: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
5580: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
5590: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
55a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
55b0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
55c0: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
55d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
55e0: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
55f0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5600: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
5610: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
5620: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5630: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
5640: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
5650: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
5660: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
5670: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
5680: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
5690: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
56a0: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
56b0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
56c0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
56d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
56e0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
56f0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5700: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
5710: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
5720: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
5730: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
5740: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
5750: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5760: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
5770: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72   /* The table or
5780: 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72   view name to cr
5790: 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74  eate is passed t
57a0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
57b0: 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70  ia tokens.  ** p
57c0: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
57d0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
57e0: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
57f0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
5800: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
5810: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
5820: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  .yyy (...);.  **
5830: 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d   .  ** Then pNam
5840: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
5850: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
5860: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
5870: 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74  r hand if.  ** t
5880: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5890: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
58a0: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a  fied, i.e.:.  **
58b0: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
58c0: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a  LE yyy(...);.  *
58d0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  *.  ** Then pNam
58e0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
58f0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
5900: 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ""..  **.  ** T
5910: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65  he call below se
5920: 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69  ts the pName poi
5930: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
5940: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
5950: 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65  e1 or.  ** pName
5960: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5970: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5980: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76  able name. The v
5990: 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20  ariable iDb is. 
59a0: 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69   ** set to the i
59b0: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
59c0: 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61  base that the ta
59d0: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74  ble or view is t
59e0: 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  o be.  ** create
59f0: 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  d in..  */.  iDb
5a00: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
5a10: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
5a20: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
5a30: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
5a40: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <0 ) return;.  i
5a50: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5a60: 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44 62  && isTemp && iDb
5a70: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
5a80: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
5a90: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
5aa0: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
5ab0: 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  fied */.    sqli
5ac0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5ad0: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
5ae0: 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  able name must b
5af0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b  e unqualified");
5b00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5b10: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
5b20: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
5b30: 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72  iDb = 1;..  pPar
5b40: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
5b50: 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65   *pName;.  zName
5b60: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5b70: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
5b80: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
5b90: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
5ba0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
5bb0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
5bc0: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
5bd0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
5be0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5bf0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
5c00: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
5c10: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
5c20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
5c30: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
5c40: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
5c50: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
5c60: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
5c70: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
5c80: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
5c90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
5ca0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5cb0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
5cc0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
5cd0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
5ce0: 7b 0a 20 20 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 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
5d10: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
5d20: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5d30: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
5d40: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
5d50: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
5d60: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
5d70: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5d80: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
5d90: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
5da0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
5db0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5dc0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5dd0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
5de0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
5df0: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
5e00: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5e10: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
5e20: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
5e30: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
5e40: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
5e50: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
5e60: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
5e70: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
5e80: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
5e90: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
5ea0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
5eb0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
5ec0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
5ed0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
5ee0: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
5ef0: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
5f00: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
5f10: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
5f20: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
5f30: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
5f40: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
5f50: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
5f60: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
5f70: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
5f80: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
5f90: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
5fa0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
5fb0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
5fc0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
5fd0: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
5fe0: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
5ff0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
6000: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
6010: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
6020: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
6030: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
6040: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
6050: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
6060: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
6070: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6080: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6090: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65      }.    pTable
60a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
60b0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64  ble(db, zName, d
60c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
60d0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  e);.    if( pTab
60e0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
60f0: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
6100: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6110: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
6120: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
6130: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
6140: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
6150: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6160: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
6170: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
6180: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  x(db, zName, 0)!
6190: 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c  =0 && (iDb==0 ||
61a0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29   !db->init.busy)
61b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
61c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
61d0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
61e0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
61f0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
6200: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6210: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6220: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c    }.  }..  pTabl
6230: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
6240: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
6250: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
6260: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
6270: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6280: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
6290: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
62a0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
62b0: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
62c0: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
62d0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
62e0: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
62f0: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
6300: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
6310: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
6320: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 61 72   = 1;.  if( pPar
6330: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20  se->pNewTable ) 
6340: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
6350: 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  le(pParse->pNewT
6360: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
6370: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
6380: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
6390: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
63a0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
63b0: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
63c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
63d0: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
63e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
63f0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
6400: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
6410: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
6420: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
6430: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
6440: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
6450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6460: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
6470: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
6480: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
6490: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
64a0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ce")==0 ){.    p
64b0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
64c0: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
64d0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
64e0: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
64f0: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
6500: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
6510: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
6520: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
6530: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
6540: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
6550: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
6560: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
6570: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
6580: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
6590: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
65a0: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
65b0: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
65c0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
65d0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
65e0: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
65f0: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
6600: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
6610: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
6620: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
6630: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
6640: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
6650: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
6660: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
6670: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
6680: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
6690: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
66a0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
66b0: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
66c0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
66d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
66e0: 6c 62 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  lbl;.    int fil
66f0: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c  eFormat;.    sql
6700: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6710: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6720: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
6730: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6740: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
6750: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
6760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6770: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65  eAddOp(v, OP_VBe
6780: 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  gin, 0, 0);.    
6790: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
67a0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
67b0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
67c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
67d0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
67e0: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
67f0: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6800: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6810: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
6820: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6830: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
6840: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
6850: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6860: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
6870: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6880: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
6890: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
68a0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
68b0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
68c0: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
68d0: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
68e0: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
68f0: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
6900: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6910: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6920: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
6930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6940: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6950: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
6960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6970: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e  , OP_Integer, EN
6980: 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 73  C(db), 0);.    s
6990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
69a0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
69b0: 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71   iDb, 4);.    sq
69c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
69d0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a  Label(v, lbl);..
69e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
69f0: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
6a00: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
6a10: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
6a20: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
6a30: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
6a40: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
6a50: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
6a60: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
6a70: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
6a80: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
6a90: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
6aa0: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
6ab0: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
6ac0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6ad0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
6ae0: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
6af0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
6b00: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
6b10: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
6b20: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
6b30: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
6b40: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
6b50: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
6b60: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
6b70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
6b80: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
6b90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6ba0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
6bb0: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
6bc0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6be0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6bf0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23   0);.    }else.#
6c00: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
6c10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c20: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
6c30: 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20  able, iDb, 0);. 
6c40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6c50: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
6c60: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
6c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c80: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
6c90: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  d, 0, 0);.    sq
6ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6cb0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
6cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6cd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
6ce0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6d00: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 4f   OP_Insert, 0, O
6d10: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
6d20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6d30: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
6d40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6d50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6d60: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
6d70: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
6d80: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
6d90: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
6da0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
6db0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
6dc0: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
6dd0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
6de0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
6df0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
6e00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
6e10: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
6e20: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
6e30: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
6e40: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
6e50: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
6e60: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
6e70: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
6e80: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
6e90: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
6ea0: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
6eb0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
6ec0: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
6ed0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
6ee0: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
6ef0: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
6f00: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
6f10: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
6f20: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
6f30: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
6f40: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
6f50: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
6f60: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
6f70: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
6f80: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
6f90: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
6fa0: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
6fb0: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
6fc0: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
6fd0: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
6fe0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
6ff0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
7000: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
7010: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
7020: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
7030: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
7040: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
7050: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
7060: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
7070: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
7080: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
7090: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
70a0: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
70b0: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
70c0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
70d0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
70e0: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
70f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7100: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
7110: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
7120: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
7130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
7140: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
7150: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
7160: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7170: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7180: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
7190: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
71a0: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
71b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
71c0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
71d0: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
71e0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
71f0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
7200: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7210: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
7220: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7230: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7240: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7250: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7260: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7270: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7280: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7290: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
72a0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
72b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
72c0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
72d0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
72e0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
72f0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
7300: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
7310: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61  aNew = sqliteRea
7320: 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28  lloc( p->aCol, (
7330: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
7340: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
7350: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
7360: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
7370: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
7380: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7390: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
73a0: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
73b0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
73c0: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
73d0: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
73e0: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
73f0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
7400: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
7410: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
7420: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
7430: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
7440: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
7450: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
7460: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
7470: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
7480: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
7490: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
74a0: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
74b0: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
74c0: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
74d0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
74e0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  E_AFF_NONE;.  p-
74f0: 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nCol++;.}../*.*
7500: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7510: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7520: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
7530: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7540: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7550: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7560: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
7570: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
7580: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
7590: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
75a0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
75b0: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
75c0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
75d0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
75e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
75f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
7600: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
7610: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
7620: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
7630: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28    int i;.  if( (
7640: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7650: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7660: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
7670: 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  l-1;.  if( i>=0 
7680: 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  ) p->aCol[i].not
7690: 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Null = onError;.
76a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
76b0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
76c0: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
76d0: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
76e0: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
76f0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
7700: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
7710: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
7720: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
7730: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
7740: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
7750: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
7760: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
7770: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
7780: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
7790: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
77a0: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
77b0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
77c0: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
77d0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
77e0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
77f0: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
7800: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
7810: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
7820: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
7830: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
7840: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
7850: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7860: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
7870: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
7880: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
7890: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78b0: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
78c0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
78d0: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
78e0: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
78f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7900: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
7910: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7920: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
7930: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7940: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
7950: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7960: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
7970: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7980: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
7990: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
79a0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
79b0: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
79c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
79d0: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
79e0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
79f0: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7a00: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7a10: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7a20: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7a30: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7a40: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7a50: 74 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  t Token *pType){
7a60: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
7a70: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
7a80: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7a90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7aa0: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70  char *zIn = pTyp
7ab0: 65 2d 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  e->z;.  const un
7ac0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e  signed char *zEn
7ad0: 64 20 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54  d = &pType->z[pT
7ae0: 79 70 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c  ype->n];..  whil
7af0: 65 28 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a  e( zIn!=zEnd ){.
7b00: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
7b10: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
7b20: 6f 77 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20  ower[*zIn];.    
7b30: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
7b40: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
7b50: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
7b60: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
7b70: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
7b80: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7b90: 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20  E_AFF_TEXT; .   
7ba0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7bb0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
7bc0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
7bd0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
7be0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
7bf0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7c00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7c10: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
7c20: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
7c30: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
7c40: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
7c50: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7c60: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7c70: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
7c80: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7c90: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
7ca0: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
7cb0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
7cc0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7cd0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
7ce0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
7cf0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7d00: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e  E_AFF_NONE;.#ifn
7d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7d20: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
7d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7d40: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
7d50: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
7d60: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
7d70: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
7d80: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7d90: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7da0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7db0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
7dc0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
7dd0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7de0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
7df0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
7e00: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
7e10: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
7e20: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
7e30: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
7e40: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
7e50: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
7e60: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
7e70: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7e80: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
7e90: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
7ea0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
7eb0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
7ec0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
7ed0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
7ee0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
7ef0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
7f00: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
7f10: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
7f20: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
7f30: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
7f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7f50: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
7f60: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
7f70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7f80: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
7f90: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
7fa0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
7fb0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
7fc0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
7fd0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
7fe0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
7ff0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
8000: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
8010: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
8020: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
8030: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8040: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8050: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
8060: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
8070: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
8080: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
8090: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
80a0: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
80b0: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
80c0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
80d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
80e0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
80f0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
8100: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
8110: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
8120: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
8130: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
8140: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
8150: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8160: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
8170: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
8180: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
8190: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
81a0: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
81b0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
81c0: 6f 6c 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 46  ol[i];.  sqliteF
81d0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  ree(pCol->zType)
81e0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
81f0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
8200: 6d 54 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20  mToken(pType);. 
8210: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8220: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
8230: 79 54 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a  yType(pType);.}.
8240: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
8250: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
8260: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
8270: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8280: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
8290: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
82a0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
82b0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
82c0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
82d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
82e0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
82f0: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
8300: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
8310: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
8320: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8330: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
8340: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
8350: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
8360: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
8370: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8380: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
8390: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
83a0: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
83b0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
83c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
83d0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69  olumn *pCol;.  i
83e0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
83f0: 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b  pNewTable)!=0 ){
8400: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
8410: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8420: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
8430: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8440: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
8450: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
8460: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8470: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
8480: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
8490: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
84a0: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
84b0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
84c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
84d0: 72 20 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20  r *pCopy;.      
84e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
84f0: 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  e(pCol->pDflt);.
8500: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
8510: 74 20 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69  t = pCopy = sqli
8520: 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72  te3ExprDup(pExpr
8530: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
8540: 70 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  py ){.        sq
8550: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
8560: 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45  pCopy->span, &pE
8570: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
8580: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8590: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
85a0: 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pExpr);.}../*.
85b0: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
85c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
85d0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
85e0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
85f0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
8600: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
8610: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
8620: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
8630: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
8640: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
8650: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
8660: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
8670: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
8680: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
8690: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
86a0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
86b0: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
86c0: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
86d0: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
86e0: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
86f0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
8700: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
8710: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
8720: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
8730: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
8740: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
8750: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
8760: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
8770: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
8780: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
8790: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
87a0: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
87b0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
87c0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
87d0: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
87e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
87f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
8800: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
8810: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
8820: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
8830: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
8840: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
8850: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
8860: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
8870: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
8880: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
8890: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
88a0: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
88b0: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
88c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
88d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
88e0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
88f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8900: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8910: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
8920: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
8930: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
8940: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
8950: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
8960: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
8970: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
8980: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
8990: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
89a0: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
89b0: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
89c0: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
89d0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
89e0: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
89f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
8a00: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
8a10: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
8a20: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
8a30: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
8a40: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
8a50: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
8a60: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
8a70: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
8a80: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
8a90: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
8aa0: 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69  if( pTab->hasPri
8ab0: 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  mKey ){.    sqli
8ac0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8ad0: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
8ae0: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
8af0: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
8b00: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
8b10: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
8b20: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
8b30: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61  ;.  }.  pTab->ha
8b40: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8b50: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
8b60: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
8b70: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
8b80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8b90: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
8ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
8bb0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
8bc0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
8bd0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
8be0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
8bf0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
8c00: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
8c10: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
8c20: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
8c30: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
8c40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
8c50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8c60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8c70: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
8c80: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
8c90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
8ca0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  imKey = 1;.     
8cb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8cc0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20   pList->nExpr>1 
8cd0: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
8ce0: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
8cf0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
8d00: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
8d10: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8d20: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
8d30: 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  f( zType && sqli
8d40: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
8d50: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
8d60: 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f          && sortO
8d70: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
8d80: 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ASC ){.    pTab-
8d90: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
8da0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
8db0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20   = onError;.    
8dc0: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20  pTab->autoInc = 
8dd0: 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65  autoInc;.  }else
8de0: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
8df0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8e00: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
8e10: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
8e20: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
8e30: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
8e40: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
8e50: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
8e60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8e70: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
8e80: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
8e90: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
8ea0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
8eb0: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
8ec0: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b  , sortOrder, 0);
8ed0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
8ee0: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
8ef0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
8f00: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
8f10: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
8f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
8f30: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
8f40: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
8f50: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
8f60: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
8f70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8f80: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
8f90: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
8fa0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
8fb0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8fc0: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
8fd0: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
8fe0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
8ff0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9000: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
9010: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
9020: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
9030: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
9040: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
9050: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
9060: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
9070: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
9080: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
9090: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
90a0: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
90b0: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
90c0: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
90d0: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
90e0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
90f0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
9100: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
9110: 64 28 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  d(pTab->pCheck, 
9120: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
9130: 43 68 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d  CheckExpr));.  }
9140: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
9150: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 68 65  3ExprDelete(pChe
9160: 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ckExpr);.}../*.*
9170: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
9180: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
9190: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
91a0: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
91b0: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
91c0: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
91d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
91e0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
91f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9200: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
9210: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62  nt nType){.  Tab
9220: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9230: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
9240: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
9250: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
9260: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
9270: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
9280: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
9290: 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 20 29   zType, nType) )
92a0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
92b0: 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  x;.    p->aCol[i
92c0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ].zColl = sqlite
92d0: 53 74 72 4e 44 75 70 28 7a 54 79 70 65 2c 20 6e  StrNDup(zType, n
92e0: 54 79 70 65 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Type);.  .    /*
92f0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
9300: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
9310: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
9320: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
9330: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
9340: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
9350: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
9360: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
9370: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
9380: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
9390: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
93a0: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
93b0: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
93c0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
93d0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
93e0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
93f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9400: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
9410: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9420: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9430: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
9440: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
9450: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
9460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
9480: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9490: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
94a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74  sequence for dat
94b0: 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78  abase native tex
94c0: 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64  t.** encoding id
94d0: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
94e0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65  string zName, le
94f0: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a  ngth nName..**.*
9500: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
9510: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
9520: 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61  uence is not ava
9530: 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61  ilable, or not a
9540: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74  vailable.** in t
9550: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  he database nati
9560: 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  ve encoding, the
9570: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
9580: 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  ry is invoked to
9590: 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20  .** request it. 
95a0: 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  If the collation
95b0: 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f   factory does no
95c0: 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20  t supply such a 
95d0: 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64  sequence,.** and
95e0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73   the sequence is
95f0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e   available in an
9600: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
9610: 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69  ing, then that i
9620: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
9630: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
9640: 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  no versions of t
9650: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
9660: 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65  lations sequence
9670: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20   are available, 
9680: 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72  or.** another er
9690: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
96a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
96b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
96c0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  e written into.*
96d0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  * pParse..**.** 
96e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
96f0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
9700: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9710: 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75  Seq().  This rou
9720: 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  tine.** invokes 
9730: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
9740: 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d  ctory if the nam
9750: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e  ed collation can
9760: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20  not be found.** 
9770: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e  and generates an
9780: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
9790: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
97a0: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
97b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
97c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
97d0: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
97e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
97f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
9800: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
9810: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
9820: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
9830: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9840: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
9850: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
9860: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  , enc, zName, nN
9870: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
9880: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
9890: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
98a0: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
98b0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
98c0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c  e3GetCollSeq(db,
98d0: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e   pColl, zName, n
98e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
98f0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  pColl ){.      i
9900: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20  f( nName<0 ){.  
9910: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74        nName = st
9920: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
9930: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9940: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9950: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
9960: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
9970: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
9980: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
9990: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
99a0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
99b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
99c0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
99d0: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
99e0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
99f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
9a00: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
9a10: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
9a20: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
9a30: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
9a40: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
9a50: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
9a60: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
9a70: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
9a80: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
9a90: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
9aa0: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
9ab0: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
9ac0: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
9ad0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
9ae0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9af0: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
9b00: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
9b10: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
9b20: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
9b30: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
9b40: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
9b50: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
9b60: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
9b70: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
9b80: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
9b90: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
9ba0: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
9bb0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
9bc0: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
9bd0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
9be0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
9bf0: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
9c00: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
9c10: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
9c20: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
9c30: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
9c40: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
9c50: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
9c60: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
9c70: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
9c80: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
9c90: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
9ca0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
9cb0: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
9cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9cd0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9ce0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  , db->aDb[iDb].p
9cf0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
9d00: 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73  ookie+1, 0);.  s
9d10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9d20: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
9d30: 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a   iDb, 0);.}../*.
9d40: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
9d50: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
9d60: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
9d70: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
9d80: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
9d90: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
9da0: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
9db0: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
9dc0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
9dd0: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
9de0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
9df0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
9e00: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
9e10: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
9e20: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
9e30: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
9e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
9e50: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
9e60: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
9e70: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
9e80: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
9e90: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
9ea0: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
9eb0: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
9ec0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
9ed0: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
9ee0: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
9ef0: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
9f00: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
9f10: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
9f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
9f30: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
9f40: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
9f50: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
9f60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9f70: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
9f80: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
9f90: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
9fa0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
9fb0: 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72  i = *pIdx;.  for
9fc0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
9fd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
9fe0: 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  isalnum(zIdent[j
9ff0: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
a000: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
a010: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
a020: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c   zIdent[j]!=0 ||
a030: 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b   isdigit(zIdent[
a040: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
a050: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
a060: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
a070: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
a080: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a090: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a0a0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a0b0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
a0c0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
a0d0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
a0e0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
a0f0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
a100: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
a110: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a120: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
a130: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
a140: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
a150: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a160: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
a170: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
a180: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
a190: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
a1a0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
a1b0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
a1c0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
a1d0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
a1e0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
a1f0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
a200: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
a210: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
a220: 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 73 54 65  ble *p, int isTe
a230: 6d 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  mp){.  int i, k,
a240: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
a250: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
a260: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20   *zSep2, *zEnd, 
a270: 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *z;.  Column *pC
a280: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
a290: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
a2a0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
a2b0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
a2c0: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
a2d0: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
a2e0: 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c  e);.    z = pCol
a2f0: 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28  ->zType;.    if(
a300: 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d   z ){.      n +=
a310: 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29   (strlen(z) + 1)
a320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20  ;.    }.  }.  n 
a330: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
a340: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
a350: 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70  n<50 ){.    zSep
a360: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
a370: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
a380: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
a390: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
a3a0: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
a3b0: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
a3c0: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
a3d0: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
a3e0: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
a3f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
a400: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
a410: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
a420: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a430: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 0a 20 20  ntf(n, zStmt,.  
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73  !OMIT_TEMPDB&&is
a460: 54 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54  Temp ? "CREATE T
a470: 45 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45  EMP TABLE ":"CRE
a480: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
a490: 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74  k = strlen(zStmt
a4a0: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
a4b0: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
a4c0: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
a4d0: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
a4e0: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
a4f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
a500: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71   pCol++){.    sq
a510: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
a520: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
a530: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
a540: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
a550: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
a560: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
a570: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
a580: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
a590: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
a5a0: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
a5b0: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
a5c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a5d0: 73 74 72 6c 65 6e 28 7a 29 2b 6b 2b 31 3c 3d 6e  strlen(z)+k+1<=n
a5e0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
a5f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
a600: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
a610: 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20   z);.      k += 
a620: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 7d  strlen(z);.    }
a630: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
a640: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
a650: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
a660: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
a670: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
a680: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a690: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
a6a0: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
a6b0: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
a6c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a6d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
a6e0: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
a6f0: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
a700: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
a710: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
a720: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
a730: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
a740: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
a750: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
a760: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
a770: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
a780: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
a790: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
a7a0: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
a7b0: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
a7c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
a7d0: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
a7e0: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
a7f0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
a800: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
a810: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
a820: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a830: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
a840: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
a850: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
a860: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
a870: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a880: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
a890: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
a8a0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
a8b0: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
a8c0: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
a8d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
a8e0: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
a8f0: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
a900: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
a910: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
a920: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
a930: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
a940: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
a950: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
a960: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
a970: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
a980: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
a990: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
a9a0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
a9b0: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
a9c0: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
a9d0: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
a9e0: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
a9f0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
aa00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
aa10: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
aa20: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
aa30: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
aa40: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
aa50: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
aa60: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
aa70: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
aa80: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
aa90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
aaa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
aab0: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
aac0: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
aad0: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
aae0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
aaf0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
ab00: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
ab10: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
ab20: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
ab30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ab40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
ab50: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45   iDb;..  if( (pE
ab60: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
ab70: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
ab80: 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
ab90: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
aba0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
abb0: 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  }.  p = pParse->
abc0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
abd0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
abe0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
abf0: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
ac00: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62 20  elect );..  iDb 
ac10: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ac20: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
ac30: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
ac40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ac50: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
ac60: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
ac70: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
ac80: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
ac90: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
aca0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73  ){.    SrcList s
acb0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
acc0: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53         /* Fake S
acd0: 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73  rcList for pPars
ace0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
acf0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
ad00: 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  sNC;            
ad10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
ad20: 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ext for pParse->
ad30: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20  pNewTable */..  
ad40: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
ad50: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
ad60: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63      memset(&sSrc
ad70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63  , 0, sizeof(sSrc
ad80: 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72  ));.    sSrc.nSr
ad90: 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e  c = 1;.    sSrc.
ada0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e  a[0].zName = p->
adb0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e  zName;.    sSrc.
adc0: 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20  a[0].pTab = p;. 
add0: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75     sSrc.a[0].iCu
ade0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  rsor = -1;.    s
adf0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
ae00: 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
ae10: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
ae20: 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20    sNC.isCheck = 
ae30: 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
ae40: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
ae50: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65  es(&sNC, p->pChe
ae60: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ck) ){.      ret
ae70: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
ae80: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
ae90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  d(SQLITE_OMIT_CH
aea0: 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ECK) */..  /* If
aeb0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
aec0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
aed0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
aee0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
aef0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
af00: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
af10: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
af20: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
af30: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
af40: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
af50: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
af60: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
af70: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
af80: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
af90: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
afa0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
afb0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
afc0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
afd0: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
afe0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
aff0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
b000: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
b010: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
b020: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
b030: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
b040: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
b050: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
b060: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
b070: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
b080: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
b090: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
b0a0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
b0b0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
b0c0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
b0d0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
b0e0: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
b0f0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
b100: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
b110: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
b120: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
b130: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
b140: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
b150: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
b160: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
b170: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
b180: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
b190: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
b1a0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
b1b0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
b1c0: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
b1d0: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
b1e0: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
b1f0: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
b200: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
b210: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
b220: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
b230: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
b240: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
b250: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
b260: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b270: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
b280: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
b290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b2a0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
b2b0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65   0);..    /* Cre
b2c0: 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
b2d0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
b2e0: 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f  le and push it o
b2f0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  nto the stack.. 
b300: 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73     ** A view has
b310: 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f   no rootpage, so
b320: 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72   just push a zer
b330: 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  o onto the stack
b340: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77   for.    ** view
b350: 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a  s.  Initialize z
b360: 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65  Type at the same
b370: 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   time..    */.  
b380: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
b390: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b3a0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
b3b0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
b3c0: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
b3d0: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
b3e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b3f0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
b400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
b410: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
b420: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
b430: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
b440: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
b450: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
b460: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
b470: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
b480: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
b490: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
b4a0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
b4b0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
b4c0: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
b4d0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
b4e0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
b4f0: 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f  ble is on the to
b500: 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74  p of the vdbe st
b510: 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack..    **.    
b520: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
b530: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
b540: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
b550: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
b560: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
b570: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
b580: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
b590: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
b5a0: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
b5b0: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
b5c0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
b5d0: 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
b5e0: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
b5f0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
b600: 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
b610: 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
b620: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
b630: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
b640: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
b650: 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
b660: 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
b670: 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
b680: 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
b690: 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
b6a0: 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
b6b0: 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
b6c0: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
b6d0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
b6e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
b6f0: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
b700: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b710: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
b720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b730: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b740: 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  r, iDb, 0);.    
b750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b760: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Op(v, OP_OpenWri
b770: 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
b780: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
b790: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b7a0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
b7b0: 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c  Select, SRT_Tabl
b7c0: 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  e, 1, 0, 0, 0, 0
b7d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b7e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b7f0: 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
b800: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
b810: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
b820: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
b830: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
b840: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
b850: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
b860: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
b870: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
b880: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
b890: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
b8a0: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
b8b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
b8c0: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
b8d0: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
b8e0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
b8f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
b900: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
b910: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b920: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65  3DeleteTable(pSe
b930: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
b940: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
b950: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
b960: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
b970: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
b980: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
b990: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
b9a0: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
b9b0: 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68 65 6d 61  mt(p, p->pSchema
b9c0: 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ==pParse->db->aD
b9d0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
b9e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b9f0: 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 50  n = pEnd->z - pP
ba00: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
ba10: 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  .z + 1;.      zS
ba20: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
ba30: 69 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20  intf("CREATE %s 
ba40: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
ba50: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
ba60: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a  oken.z);.    }..
ba70: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
ba80: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
ba90: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
baa0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
bab0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
bac0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
bad0: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
bae0: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
baf0: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
bb00: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
bb10: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
bb20: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
bb30: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
bb40: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
bb50: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
bb60: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
bb70: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
bb80: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
bb90: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
bba0: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
bbb0: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
bbc0: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
bbd0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
bbe0: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
bbf0: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
bc00: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
bc10: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
bc20: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
bc30: 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c  rootpage=#0, sql
bc40: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
bc50: 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20  ERE rowid=#1",. 
bc60: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
bc70: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
bc80: 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
bc90: 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70    zType,.      p
bca0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70  ->zName,.      p
bcb0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 7a  ->zName,.      z
bcc0: 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
bcd0: 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74  sqliteFree(zStmt
bce0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
bcf0: 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
bd00: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
bd10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
bd20: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f  OINCREMENT.    /
bd30: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
bd40: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65  f we need to cre
bd50: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65  ate an sqlite_se
bd60: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72  quence table for
bd70: 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20  .    ** keeping 
bd80: 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63  track of autoinc
bd90: 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20  rement keys..   
bda0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   */.    if( p->a
bdb0: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
bdc0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
bdd0: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69  Db[iDb];.      i
bde0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
bdf0: 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
be00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
be10: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
be20: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
be30: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
be40: 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
be50: 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
be60: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
be70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
be80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
be90: 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
bea0: 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
beb0: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
bec0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
bed0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
bee0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
bef0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
bf00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf10: 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d  MPrintf("tbl_nam
bf20: 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65  e='%q'",p->zName
bf30: 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
bf40: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
bf50: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
bf60: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
bf70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
bf80: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
bf90: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
bfa0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  sy && pParse->nE
bfb0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  rr==0 ){.    Tab
bfc0: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b  le *pOld;.    FK
bfd0: 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20  ey *pFKey; .    
bfe0: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
bff0: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
c000: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
c010: 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
c020: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
c030: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
c040: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20  ->zName)+1,p);. 
c050: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
c060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
c070: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
c080: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
c090: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
c0a0: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
c0b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 23   return;.    }.#
c0c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c0d0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
c0e0: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
c0f0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
c100: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
c110: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
c120: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
c130: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
c140: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
c150: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
c160: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
c170: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
c180: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
c190: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
c1a0: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
c1b0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
c1c0: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
c1d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72  .#endif.    pPar
c1e0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
c1f0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
c200: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
c210: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
c220: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
c230: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c240: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
c250: 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
c260: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
c270: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
c280: 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
c290: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
c2a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
c2b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c2c0: 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
c2d0: 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
c2e0: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
c2f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
c300: 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
c310: 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
c320: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
c330: 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65  pCons->z - zName
c340: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
c350: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
c360: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
c370: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
c380: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c390: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
c3a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
c3b0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
c3c0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
c3d0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
c3e0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
c3f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c400: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
c410: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c420: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
c430: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
c440: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
c450: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
c460: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
c470: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
c480: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
c490: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
c4a0: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
c4b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
c4c0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
c4d0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
c4e0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
c4f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c500: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
c510: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
c520: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
c530: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
c540: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
c550: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
c560: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
c570: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
c580: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
c590: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
c5a0: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
c5b0: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
c5c0: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
c5d0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
c5e0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
c5f0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
c600: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
c610: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
c620: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
c630: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ame;.  int iDb;.
c640: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c650: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
c660: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c670: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
c680: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
c690: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
c6a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
c6b0: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
c6c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c6d0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
c6e0: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
c6f0: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
c700: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
c710: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
c720: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
c730: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
c740: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
c750: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c760: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
c770: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
c780: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
c790: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
c7a0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
c7b0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
c7c0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
c7d0: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
c7e0: 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ema);.  if( sqli
c7f0: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
c800: 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
c810: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
c820: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
c830: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
c840: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
c850: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
c860: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
c870: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
c880: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
c890: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
c8a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
c8b0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
c8c0: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
c8d0: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
c8e0: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
c8f0: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
c900: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
c910: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
c920: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
c930: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
c940: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
c950: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
c960: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
c970: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
c980: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
c990: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
c9a0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
c9b0: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
c9c0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
c9d0: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
c9e0: 63 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ct);.  if( sqlit
c9f0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
ca00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
ca10: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72 73    }.  if( !pPars
ca20: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
ca30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
ca40: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
ca50: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
ca60: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
ca70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
ca80: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
ca90: 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
caa0: 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
cab0: 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
cac0: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
cad0: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73  stToken;.  if( s
cae0: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73  End.z[0]!=0 && s
caf0: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
cb00: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
cb10: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
cb20: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 73  d.n = 0;.  n = s
cb30: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
cb40: 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  z;.  z = (const 
cb50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
cb60: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
cb70: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
cb80: 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63  ]==';' || isspac
cb90: 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d  e(z[n-1])) ){ n-
cba0: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
cbb0: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
cbc0: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
cbd0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
cbe0: 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
cbf0: 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
cc00: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
cc10: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
cc20: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
cc30: 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  End, 0);.  retur
cc40: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
cc50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
cc60: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
cc70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
cc80: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
cc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
cca0: 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54  ALTABLE)./*.** T
ccb0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
ccc0: 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
ccd0: 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
cce0: 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
ccf0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
cd00: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
cd10: 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
cd20: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
cd30: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
cd40: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
cd50: 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
cd60: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
cd70: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
cd80: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
cd90: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
cda0: 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
cdb0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
cdc0: 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
cdd0: 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
cde0: 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
cdf0: 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
ce00: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
ce10: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
ce20: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
ce30: 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
ce40: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
ce50: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
ce60: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
ce70: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
ce80: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
ce90: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
cea0: 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
ceb0: 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
cec0: 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
ced0: 6e 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ned */..  assert
cee0: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
cef0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cf00: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
cf10: 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43  if( sqlite3VtabC
cf20: 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73  allConnect(pPars
cf30: 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  e, pTable) ){.  
cf40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cf50: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
cf60: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
cf70: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
cf80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
cf90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
cfa0: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
cfb0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
cfc0: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
cfd0: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
cfe0: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
cff0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
d000: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
d010: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
d020: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
d030: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
d040: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
d050: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
d060: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
d070: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
d080: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
d090: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
d0a0: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
d0b0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
d0c0: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
d0d0: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
d0e0: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
d0f0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
d100: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
d110: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
d120: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
d130: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
d140: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
d150: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
d160: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
d170: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
d180: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
d190: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
d1a0: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
d1b0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
d1c0: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
d1d0: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
d1e0: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
d1f0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
d200: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
d210: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d220: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
d230: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
d240: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
d250: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
d260: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
d270: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
d280: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
d290: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
d2a0: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
d2b0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
d2c0: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
d2d0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
d2e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
d2f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
d300: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
d310: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
d320: 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
d330: 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
d340: 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
d350: 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
d360: 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
d370: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
d380: 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
d390: 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
d3a0: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
d3b0: 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
d3c0: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
d3d0: 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
d3e0: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
d3f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
d400: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
d410: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
d420: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
d430: 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
d440: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
d450: 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  p(pTable->pSelec
d460: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29  t);.  if( pSel )
d470: 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65  {.    n = pParse
d480: 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69  ->nTab;.    sqli
d490: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
d4a0: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
d4b0: 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20  pSel->pSrc);.   
d4c0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
d4d0: 2d 31 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20  -1;.    pSelTab 
d4e0: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
d4f0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
d500: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e, 0, pSel);.   
d510: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
d520: 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
d530: 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
d540: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
d550: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
d560: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
d570: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
d580: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
d590: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
d5a0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
d5b0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
d5c0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
d5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
d5e0: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
d5f0: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  b);.      pTable
d600: 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
d610: 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
d620: 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
d630: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
d640: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
d650: 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
d660: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
d670: 65 74 65 28 70 53 65 6c 29 3b 0a 20 20 7d 20 65  ete(pSel);.  } e
d680: 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
d690: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
d6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d6b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
d6c0: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
d6d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d6e0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
d6f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d700: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d710: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
d720: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
d730: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
d740: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
d750: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
d760: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
d770: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
d780: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
d790: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d7a0: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
d7b0: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
d7c0: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
d7d0: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
d7e0: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
d7f0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
d800: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
d810: 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
d820: 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
d830: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
d840: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
d850: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d860: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
d870: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
d880: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
d890: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
d8a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
d8b0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
d8c0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
d8d0: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
d8e0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
d8f0: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
d900: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d910: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
d920: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d930: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
d940: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
d950: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
d960: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
d970: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
d980: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
d990: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
d9a0: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
d9b0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
d9c0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
d9d0: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
d9e0: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
d9f0: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
da00: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
da10: 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
da20: 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
da30: 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
da40: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
da50: 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
da60: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
da70: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
da80: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
da90: 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
daa0: 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
dab0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
dac0: 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
dad0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
dae0: 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
daf0: 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
db00: 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
db10: 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
db20: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
db30: 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
db40: 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
db50: 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
db60: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
db70: 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
db80: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
db90: 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
dba0: 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
dbb0: 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
dbc0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
dbd0: 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
dbe0: 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
dbf0: 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
dc00: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
dc10: 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
dc20: 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
dc30: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
dc40: 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
dc50: 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
dc60: 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
dc70: 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
dc80: 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
dc90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dca0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
dcb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
dcc0: 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44  PageMoved(Db *pD
dcd0: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
dce0: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
dcf0: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
dd00: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61  h *pHash;..  pHa
dd10: 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
dd20: 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
dd30: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
dd40: 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
dd50: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
dd60: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
dd70: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
dd80: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
dd90: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
dda0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
ddb0: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
ddc0: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
ddd0: 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
dde0: 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
ddf0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
de00: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
de10: 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
de20: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
de30: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
de40: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
de50: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
de60: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
de70: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
de80: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
de90: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
dea0: 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
deb0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
dec0: 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
ded0: 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
dee0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
def0: 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
df00: 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
df10: 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
df20: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
df30: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
df40: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
df50: 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
df60: 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
df70: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
df80: 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
df90: 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
dfa0: 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
dfb0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
dfc0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
dfd0: 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
dfe0: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
dff0: 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
e000: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
e010: 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
e020: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
e030: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
e040: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e050: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72  ddOp(v, OP_Destr
e060: 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62 29  oy, iTable, iDb)
e070: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e080: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e090: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
e0a0: 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65 67   pushes an integ
e0b0: 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  er onto the stac
e0c0: 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  k. If this integ
e0d0: 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
e0e0: 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
e0f0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
e100: 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
e110: 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
e120: 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
e130: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
e140: 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
e150: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e160: 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
e170: 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
e180: 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20 74  ** The "#0" in t
e190: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
e1a0: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
e1b0: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
e1c0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 6f   value.  ** is o
e1d0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
e1e0: 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71 6c   stack.  See sql
e1f0: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
e200: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
e210: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
e220: 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
e230: 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
e240: 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
e250: 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  #0 AND rootpage=
e260: 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  #0",.     pParse
e270: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
e280: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
e290: 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 29  LE(iDb), iTable)
e2a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
e2b0: 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
e2c0: 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
e2d0: 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
e2e0: 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
e2f0: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
e300: 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
e310: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
e320: 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
e330: 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
e340: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
e350: 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
e360: 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
e370: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
e380: 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
e390: 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
e3a0: 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
e3b0: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
e3c0: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
e3d0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
e3e0: 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
e3f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
e400: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66  able *pTab){.#if
e410: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e420: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64  AUTOVACUUM.  Ind
e430: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
e440: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
e450: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
e460: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
e470: 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79  hema);.  destroy
e480: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
e490: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62   pTab->tnum, iDb
e4a0: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  );.  for(pIdx=pT
e4b0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e4c0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e4d0: 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  xt){.    destroy
e4e0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
e4f0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
e500: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f  );.  }.#else.  /
e510: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
e520: 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61  e may be auto-va
e530: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66  cuum capable (if
e540: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e550: 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20  OVACUUM.  ** is 
e560: 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68  not defined), th
e570: 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  en it is importa
e580: 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65  nt to call OP_De
e590: 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a  stroy on the.  *
e5a0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
e5b0: 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20  x root-pages in 
e5c0: 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20  order, starting 
e5d0: 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63  with the numeric
e5e0: 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65  ally .  ** large
e5f0: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
e600: 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e  ber. This guaran
e610: 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f  tees that none o
e620: 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73  f the root-pages
e630: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74  .  ** to be dest
e640: 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74  royed is relocat
e650: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
e660: 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65   OP_Destroy. i.e
e670: 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  . if the.  ** fo
e680: 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64  llowing were cod
e690: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50  ed:.  **.  ** OP
e6a0: 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a  _Destroy 4 0.  *
e6b0: 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65  * ....  ** OP_De
e6c0: 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20  stroy 5 0.  **. 
e6d0: 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67   ** and root pag
e6e0: 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20  e 5 happened to 
e6f0: 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  be the largest r
e700: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
e710: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
e720: 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20  base, then root 
e730: 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20  page 5 would be 
e740: 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20  moved to page 4 
e750: 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50  by the .  ** "OP
e760: 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70  _Destroy 4 0" op
e770: 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71  code. The subseq
e780: 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79  uent "OP_Destroy
e790: 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a   5 0" would hit.
e7a0: 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74    ** a free-list
e7b0: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   page..  */.  in
e7c0: 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74  t iTab = pTab->t
e7d0: 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74  num;.  int iDest
e7e0: 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  royed = 0;..  wh
e7f0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e  ile( 1 ){.    In
e800: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69  dex *pIdx;.    i
e810: 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b  nt iLargest = 0;
e820: 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72  ..    if( iDestr
e830: 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c  oyed==0 || iTab<
e840: 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20  iDestroyed ){.  
e850: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
e860: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Tab;.    }.    f
e870: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
e880: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e890: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e8a0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
e8b0: 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
e8c0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
e8d0: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
e8e0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
e8f0: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
e900: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
e910: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
e920: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
e930: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
e940: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
e950: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
e960: 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gest==0 ){.     
e970: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
e980: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  se{.      int iD
e990: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
e9a0: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
e9b0: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
e9c0: 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  ma);.      destr
e9d0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
e9e0: 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
e9f0: 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
ea00: 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
ea10: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ea20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ea30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ea40: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
ea50: 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
ea60: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
ea70: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
ea80: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
ea90: 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
eaa0: 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
eab0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
eac0: 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
ead0: 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
eae0: 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
eaf0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
eb00: 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
eb10: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
eb20: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
eb30: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
eb40: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
eb50: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
eb60: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
eb70: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
eb80: 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
eb90: 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  ==1 );.  pTab = 
eba0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
ebb0: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
ebc0: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
ebd0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
ebe0: 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  ase);..  if( pTa
ebf0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
ec00: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  noErr ){.      s
ec10: 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72  qlite3ErrorClear
ec20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
ec30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
ec40: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
ec50: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ec60: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ec70: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
ec80: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
ec90: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
eca0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ecb0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
ecc0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
ecd0: 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
ece0: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
ecf0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
ed00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ed10: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
ed20: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
ed30: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
ed40: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
ed50: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
ed60: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
ed70: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
ed80: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
ed90: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
eda0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
edb0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
edc0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
edd0: 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
ede0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
edf0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
ee00: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
ee10: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
ee20: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
ee30: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
ee40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ee50: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
ee60: 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
ee70: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
ee80: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
ee90: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
eea0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
eeb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
eec0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
eed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 64 65      }.      code
eee0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
eef0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
ef00: 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d  g2 = pTab->pMod-
ef10: 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
ef20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef30: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
ef40: 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
ef50: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
ef60: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
ef70: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
ef80: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
ef90: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
efa0: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
efb0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
efc0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
efd0: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
efe0: 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
eff0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f000: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f010: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
f020: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
f030: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
f040: 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
f050: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
f060: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
f070: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
f080: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
f090: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
f0a0: 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61 44   || pTab==db->aD
f0b0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
f0c0: 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20 73  pSeqTab ){.    s
f0d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
f0e0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
f0f0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
f100: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
f110: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
f120: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f130: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f140: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
f150: 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
f160: 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
f170: 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
f180: 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
f190: 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
f1a0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
f1b0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
f1c0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
f1d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f1e0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
f1f0: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
f200: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
f210: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
f220: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
f230: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
f240: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
f250: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
f260: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f270: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
f280: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
f290: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
f2a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
f2b0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f2c0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
f2d0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f2e0: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
f2f0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
f300: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
f310: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
f320: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
f330: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f340: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69  if( v ){.    Tri
f350: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
f360: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
f370: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
f380: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
f390: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
f3a0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
f3b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f3c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
f3d0: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
f3e0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
f3f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
f400: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f410: 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29 7b  ;.      if( v ){
f420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f440: 56 42 65 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20  VBegin, 0, 0);. 
f450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
f460: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  dif..    /* Drop
f470: 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
f480: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
f490: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
f4a0: 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
f4b0: 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
f4c0: 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
f4d0: 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
f4e0: 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
f4f0: 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
f500: 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
f510: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
f520: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
f530: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69  Trigger;.    whi
f540: 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
f550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
f560: 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
f570: 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
f580: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54 72  | .          pTr
f590: 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
f5a0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
f5b0: 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ma );.      sqli
f5c0: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
f5d0: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
f5e0: 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67  er);.      pTrig
f5f0: 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
f600: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  pNext;.    }..#i
f610: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f620: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
f630: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
f640: 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
f650: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
f660: 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
f670: 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68  d with.    ** th
f680: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
f690: 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
f6a0: 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
f6b0: 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
f6c0: 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74      ** at the bt
f6d0: 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
f6e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
f6f0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
f700: 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76  ds to.    ** mov
f710: 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
f720: 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
f730: 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
f740: 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20  cuum mode)..    
f750: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
f760: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
f770: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
f780: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
f790: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
f7a0: 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %s.sqlite_sequ
f7b0: 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
f7c0: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  %Q",.        pDb
f7d0: 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
f7e0: 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
f7f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
f800: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
f810: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
f820: 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
f830: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
f840: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
f850: 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
f860: 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
f870: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
f880: 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
f890: 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
f8a0: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
f8b0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
f8c0: 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
f8d0: 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
f8e0: 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
f8f0: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
f900: 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
f910: 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
f920: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
f930: 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
f940: 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
f950: 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
f960: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
f970: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
f980: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
f990: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
f9a0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
f9b0: 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
f9c0: 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
f9d0: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
f9e0: 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
f9f0: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
fa00: 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
fa10: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
fa20: 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
fa30: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
fa40: 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
fa50: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
fa60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
fa70: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
fa80: 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
fa90: 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
faa0: 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
fab0: 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
fac0: 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20  cookie..    */. 
fad0: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
fae0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
faf0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
fb00: 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
fb10: 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
fb20: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
fb30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
fb40: 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
fb50: 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e  , iDb, 0, pTab->
fb60: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
fb70: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
fb80: 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
fb90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
fba0: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
fbb0: 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
fbc0: 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
fbd0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
fbe0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
fbf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
fc00: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
fc10: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
fc20: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
fc30: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
fc40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
fc50: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
fc60: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
fc70: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
fc80: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
fc90: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
fca0: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
fcb0: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
fcc0: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
fcd0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
fce0: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
fcf0: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
fd00: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
fd10: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
fd20: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
fd30: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
fd40: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
fd50: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
fd60: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
fd70: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
fd80: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
fd90: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
fda0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
fdb0: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
fdc0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
fdd0: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
fde0: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
fdf0: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
fe00: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
fe10: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
fe20: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
fe30: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
fe40: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
fe50: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
fe60: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
fe70: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
fe80: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
fe90: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
fea0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
feb0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
fec0: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
fed0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
fee0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
fef0: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
ff00: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
ff10: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
ff20: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
ff30: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
ff40: 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
ff50: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
ff60: 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
ff70: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
ff80: 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
ff90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ffa0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ffb0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
ffc0: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
ffd0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
ffe0: 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
fff0: 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
10000 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
10010 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
10020 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
10030 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
10040 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
10050 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
10060 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
10070 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
10080 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
10090 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
100a0 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
100b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
100c0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
100d0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
100e0 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d   0;.  Table *p =
100f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10100 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
10110 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10120 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
10130 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
10140 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
10150 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10160 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
10170 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
10180 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
10190 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
101a0 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
101b0 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
101c0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
101d0 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
101e0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
101f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
10200 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10210 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
10220 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
10230 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
10240 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
10250 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
10260 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
10270 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
10280 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
10290 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
102a0 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
102b0 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
102c0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
102d0 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
102e0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
102f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10300 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
10310 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
10320 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
10330 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
10340 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
10350 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
10360 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
10370 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
10380 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
10390 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
103a0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
103b0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
103c0 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
103d0 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
103e0 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
103f0 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
10400 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
10410 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
10420 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
10430 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
10440 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
10450 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
10460 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
10470 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
10480 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
10490 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
104a0 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
104b0 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
104c0 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
104d0 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
104e0 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
104f0 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
10500 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
10510 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
10520 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
10530 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
10540 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
10550 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
10560 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
10570 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
10580 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
10590 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
105a0 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
105b0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
105c0 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
105d0 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
105e0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
105f0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
10600 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10610 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
10620 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
10630 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
10640 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10650 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
10660 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
10670 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
10680 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10690 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
106a0 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
106b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
106c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
106d0 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
106e0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
106f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10700 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
10710 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
10720 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
10730 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
10740 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
10750 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
10760 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
10770 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
10780 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
10790 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
107a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
107b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
107c0 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43   n = strlen(pToC
107d0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
107e0 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
107f0 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
10800 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
10810 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
10820 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
10830 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
10840 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
10850 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
10860 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
10870 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d  ey->deleteConf =
10880 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20   flags & 0xff;. 
10890 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f   pFKey->updateCo
108a0 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38  nf = (flags >> 8
108b0 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b   ) & 0xff;.  pFK
108c0 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d  ey->insertConf =
108d0 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20   (flags >> 16 ) 
108e0 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69  & 0xff;..  /* Li
108f0 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
10900 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
10910 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
10920 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
10930 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
10940 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
10950 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46  .  sqliteFree(pF
10960 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
10970 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10980 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
10990 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
109a0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  prListDelete(pFr
109b0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
109c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
109d0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
109e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
109f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
10a00 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
10a10 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
10a20 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
10a30 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
10a40 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
10a50 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
10a60 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
10a70 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
10a80 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
10a90 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
10aa0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
10ab0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
10ac0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
10ad0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
10ae0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
10af0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
10b00 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
10b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
10b20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
10b30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
10b40 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
10b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10b60 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
10b70 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
10b80 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
10b90 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
10ba0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
10bb0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
10bc0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
10bd0 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
10be0 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
10bf0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
10c00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10c10 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
10c20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
10c30 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
10c40 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
10c50 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
10c60 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
10c70 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
10c80 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
10c90 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
10ca0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
10cb0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
10cc0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
10cd0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
10ce0 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
10cf0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
10d00 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
10d10 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63  d.  The memory c
10d20 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79  ell specified by
10d30 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
10d40 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
10d50 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
10d60 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
10d70 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
10d80 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
10d90 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
10da0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
10db0 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
10dc0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
10dd0 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
10de0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
10df0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
10e00 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
10e10 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
10e20 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
10e30 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
10e40 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
10e50 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
10e60 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
10e70 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
10e80 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
10e90 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
10ea0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
10eb0 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
10ec0 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  >nTab;       /* 
10ed0 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
10ee0 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
10ef0 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
10f00 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f  e->nTab+1;     /
10f10 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
10f20 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
10f30 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10f60 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
10f70 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
10fa0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
10fb0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
10fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
10fd0 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
10fe0 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
10ff0 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  chine */.  KeyIn
11000 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20  fo *pKey;       
11010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
11020 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a  Info for index *
11030 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
11040 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11050 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
11060 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
11070 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11080 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11090 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
110a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
110b0 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
110c0 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
110d0 2c 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73  , 0,.      pPars
110e0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
110f0 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
11100 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
11110 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
11120 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
11130 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
11140 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
11150 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
11160 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
11170 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
11180 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
11190 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
111a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
111b0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
111c0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
111d0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
111e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
11200 61 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c  ad, memRootPage,
11210 20 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20   0);.    tnum = 
11220 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11230 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
11240 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
11250 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11260 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
11270 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11280 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11290 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29  Integer, iDb, 0)
112a0 3b 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  ;.  pKey = sqlit
112b0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
112c0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
112d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
112e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
112f0 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63  , iIdx, tnum, (c
11300 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b  har *)pKey, P3_K
11310 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
11320 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
11330 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
11340 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
11350 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
11360 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
11370 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
11380 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
11390 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
113a0 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
113b0 78 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20  x, iTab);.  if( 
113c0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
113d0 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
113e0 69 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71  int curaddr = sq
113f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11400 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74  Addr(v);.    int
11410 20 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72   addr2 = curaddr
11420 2b 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +4;.    sqlite3V
11430 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63  dbeChangeP2(v, c
11440 75 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29  uraddr-1, addr2)
11450 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11460 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
11470 69 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  id, iTab, 0);.  
11480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11490 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
114a0 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
114b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
114c0 4f 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64  OP_IsUnique, iId
114d0 78 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73  x, addr2);.    s
114e0 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
114f0 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
11500 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f  _CONSTRAINT, OE_
11510 41 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Abort,.         
11520 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65             "inde
11530 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
11540 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f  not unique", P3_
11550 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73  STATIC);.    ass
11560 65 72 74 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ert( sqlite3Mall
11570 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20 61 64  ocFailed() || ad
11580 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  dr2==sqlite3Vdbe
11590 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 29  CurrentAddr(v) )
115a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
115b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
115c0 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
115d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
115e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
115f0 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
11600 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11610 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11620 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11630 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11640 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  se, iTab, 0);.  
11650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11660 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
11670 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx, 0);.}../*.**
11680 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
11690 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
116a0 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
116b0 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
116c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
116d0 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
116e0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
116f0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
11700 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11710 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
11720 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
11730 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
11740 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
11750 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
11760 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
11770 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
11780 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
11790 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
117a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
117b0 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
117c0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
117d0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
117e0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
117f0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
11800 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
11810 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
11820 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
11830 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
11840 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11850 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
11860 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
11870 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
11880 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
11890 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
118a0 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
118b0 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
118c0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
118d0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
118e0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
118f0 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
11900 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
11910 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11920 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
11930 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
11940 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
11950 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
11960 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
11970 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
11980 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
11990 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
119a0 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
119b0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
119c0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
119d0 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
119e0 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
119f0 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
11a00 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
11a10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11a20 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
11a30 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
11a40 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11a50 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
11a60 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
11a70 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
11a80 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
11a90 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
11aa0 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
11ab0 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
11ac0 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
11ad0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
11ae0 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
11af0 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
11b00 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
11b10 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11b20 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
11b30 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
11b40 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
11b50 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
11b60 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
11b70 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
11b80 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
11b90 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
11ba0 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
11bb0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
11bc0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
11bd0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
11be0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
11bf0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
11c00 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
11c10 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
11c20 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
11c30 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11c40 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
11c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11c60 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
11c70 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
11c80 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
11c90 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
11ca0 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
11cb0 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
11cc0 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
11cd0 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
11ce0 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
11cf0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
11d00 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
11d10 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
11d20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
11d30 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
11d40 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
11d50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11d60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
11d70 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
11d80 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
11d90 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
11da0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
11db0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
11dc0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
11dd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
11de0 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
11df0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
11e00 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
11e10 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
11e20 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
11e30 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
11e40 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
11e50 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11e60 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
11e70 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11e80 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
11e90 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
11ea0 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
11eb0 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
11ec0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
11ed0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
11ee0 65 64 28 29 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  ed() || IN_DECLA
11ef0 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
11f00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11f10 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
11f20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
11f30 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
11f40 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
11f50 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
11f60 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
11f70 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
11f80 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
11f90 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
11fa0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
11fb0 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
11fc0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
11fd0 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
11fe0 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
11ff0 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
12000 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
12010 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
12020 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
12030 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
12040 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
12050 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
12060 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
12070 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
12080 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
12090 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
120a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
120b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
120c0 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
120d0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
120e0 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
120f0 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
12100 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
12110 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
12120 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
12130 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
12140 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  o 1..    */.    
12150 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
12160 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
12170 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
12180 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
12190 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
121a0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
121b0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
121c0 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
121d0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
121e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
121f0 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
12200 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
12210 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
12220 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
12230 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
12240 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
12250 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
12260 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
12270 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
12280 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
12290 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
122a0 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
122b0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
122c0 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
122d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
122e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
122f0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
12300 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
12310 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
12320 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
12330 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
12340 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
12350 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
12360 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
12380 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
12390 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
123a0 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
123b0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
123c0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
123d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
123e0 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
123f0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
12400 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12410 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
12420 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
12430 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
12440 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
12450 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28  aDb[iDb];..  if(
12460 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
12470 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
12480 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12490 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  x;.  if( pTab->r
124a0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
124b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
124c0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
124d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
124e0 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
124f0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
12500 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12510 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12520 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
12530 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
12540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12550 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12560 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
12570 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
12580 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12590 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
125a0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
125b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
125c0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
125d0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
125e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
125f0 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
12600 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
12610 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
12620 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12630 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
12640 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
12650 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
12660 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
12670 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
12680 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
12690 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
126a0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
126b0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
126c0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
126d0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
126e0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
126f0 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
12700 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
12710 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
12720 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
12730 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
12740 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
12750 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
12760 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
12770 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
12780 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
12790 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
127a0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
127b0 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
127c0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
127d0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
127e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
127f0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
12800 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
12810 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
12820 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
12830 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
12840 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
12850 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
12860 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
12870 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
12880 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
12890 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
128a0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  me);.    if( SQL
128b0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
128c0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
128d0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
128e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
128f0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
12900 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12910 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53  index;.    if( S
12920 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
12930 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
12940 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
12950 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
12960 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
12980 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
12990 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
129a0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
129b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
129c0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
129d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
129e0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
129f0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
12a00 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
12a10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12a20 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
12a30 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
12a40 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
12a50 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
12a60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12a70 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
12a80 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
12a90 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
12aa0 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
12ab0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
12ac0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
12ad0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12ae0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12af0 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
12b00 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
12b10 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
12b20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12b30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12b40 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
12b50 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
12b60 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
12b70 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
12b80 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
12b90 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
12ba0 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
12bb0 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
12bc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12bd0 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
12be0 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
12bf0 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
12c00 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
12c10 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
12c20 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
12c30 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
12c40 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
12c50 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
12c60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
12c70 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
12c80 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
12c90 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
12ca0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
12cb0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12cc0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12cd0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
12ce0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
12cf0 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  pDb->zName;.    
12d00 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
12d10 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
12d20 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
12d30 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
12d40 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12d50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12d60 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12d70 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
12d80 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
12d90 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
12da0 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
12db0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
12dc0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
12dd0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12de0 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
12df0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
12e00 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12e10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12e20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12e30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
12e40 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
12e50 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
12e60 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
12e70 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
12e80 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
12e90 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
12ea0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
12eb0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
12ec0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
12ed0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
12ee0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
12ef0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12f00 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
12f10 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54  llId.z = (u8*)pT
12f20 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
12f30 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
12f40 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
12f50 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  len((char*)nullI
12f60 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
12f70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12f80 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e  tAppend(0, 0, &n
12f90 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
12fa0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
12fb0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12fc0 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  x;.    pList->a[
12fd0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
12fe0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
12ff0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
13000 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
13010 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
13020 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
13030 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
13040 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
13050 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
13060 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
13070 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
13080 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
13090 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
130a0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
130b0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
130c0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
130d0 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e  + strlen(pExpr->
130e0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
130f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13100 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
13110 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
13120 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
13130 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
13140 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
13150 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
13160 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
13170 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  c( .      sizeof
13180 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20  (Index) +       
13190 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
131a0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
131b0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
131c0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
131d0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
131e0 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  mn   */.      si
131f0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b  zeof(int)*(nCol+
13200 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e  1) +       /* In
13210 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
13220 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
13230 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
13240 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
13250 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
13260 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
13270 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
13280 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
13290 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d  er */.      nNam
132a0 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
132b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
132c0 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a  x.zName      */.
132d0 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20        nExtra    
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
13300 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a  sequence names *
13310 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  /.  );.  if( sql
13320 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
13330 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  () ) goto exit_c
13340 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
13350 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
13360 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
13370 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
13380 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
13390 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
133a0 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
133b0 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
133c0 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
133d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
133e0 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
133f0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
13400 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
13410 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
13420 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
13430 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
13440 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
13450 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
13460 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
13470 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
13480 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  +1]);.  memcpy(p
13490 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
134a0 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
134b0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
134c0 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
134d0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
134e0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
134f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e  ex->onError = on
13500 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
13510 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61  >autoIndex = pNa
13520 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d  me==0;.  pIndex-
13530 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
13540 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
13550 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
13560 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
13570 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
13580 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
13590 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
135a0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
135b0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
135c0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
135d0 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
135e0 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
135f0 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
13600 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
13610 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
13620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
13630 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
13640 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
13650 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
13660 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
13670 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
13680 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
13690 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
136a0 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
136b0 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
136c0 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
136d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
136e0 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
136f0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
13700 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
13710 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
13720 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
13730 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
13740 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
13750 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
13760 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
13770 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
13780 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
13790 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
137a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
137b0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
137c0 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
137d0 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
137e0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
137f0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
13800 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
13810 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
13820 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
13830 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13840 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
13850 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
13860 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13870 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
13880 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
13890 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
138a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
138b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
138c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
138d0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  dex;.    }.    /
138e0 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
138f0 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
13900 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
13910 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
13920 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74  ed.    ** more t
13930 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
13940 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
13950 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
13960 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20  instance of.    
13970 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69  ** the column wi
13980 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20  ll ever be used 
13990 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
139a0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69  .  Note that usi
139b0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61  ng the.    ** sa
139c0 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74  me column more t
139d0 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20  han once cannot 
139e0 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  be an error beca
139f0 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a  use that would .
13a00 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63      ** break bac
13a10 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
13a20 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
13a30 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
13a40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64  .    */.    pInd
13a50 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
13a60 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
13a70 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b  stItem->pExpr ){
13a80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13a90 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
13aa0 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >pColl );.      
13ab0 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
13ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
13ad0 70 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a  printf(nExtra, z
13ae0 45 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69  Extra, "%s", pLi
13af0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
13b00 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13b10 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73      zExtra += (s
13b20 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31  trlen(zColl) + 1
13b30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13b40 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
13b50 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
13b60 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
13b70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  l ){.        zCo
13b80 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
13b90 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ll->zName;.     
13ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13bb0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
13bc0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
13bd0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
13be0 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20   zColl, -1) ){. 
13bf0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13c00 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13c10 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
13c20 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
13c30 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
13c40 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
13c50 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
13c60 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
13c70 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
13c80 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71  rtOrder[i] = req
13c90 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
13ca0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
13cb0 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
13cc0 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
13cd0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
13ce0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
13cf0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
13d00 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
13d10 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
13d20 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
13d30 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
13d40 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13d50 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
13d60 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
13d70 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
13d80 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
13d90 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
13da0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
13db0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
13dc0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
13dd0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
13de0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
13df0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
13e00 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
13e10 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
13e20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
13e30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
13e40 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
13e50 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
13e60 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
13e70 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
13e80 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
13e90 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
13ea0 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
13eb0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
13ec0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
13ed0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
13ee0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
13ef0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
13f00 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
13f10 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
13f20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
13f30 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
13f40 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
13f50 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
13f60 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
13f70 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
13f80 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
13f90 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
13fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13fb0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
13fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13fd0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
13fe0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
13ff0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
14000 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
14010 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
14020 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
14030 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
14040 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
14050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20  onst char *z1 = 
14060 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
14070 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
14080 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78  har *z2 = pIndex
14090 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
140a0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
140b0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
140c0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
140d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
140e0 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
140f0 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78  Order[k]!=pIndex
14100 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  ->aSortOrder[k] 
14110 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
14120 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
14130 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
14140 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
14150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14160 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
14170 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
14180 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
14190 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
141a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
141b0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
141c0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
141d0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
141e0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
141f0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
14200 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
14210 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
14220 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
14230 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
14240 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
14250 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
14260 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
14270 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
14280 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
14290 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
142a0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
142b0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
142c0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
142d0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
142e0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
142f0 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
14300 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
14310 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
14320 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
14330 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
14340 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
14350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
14360 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
14370 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
14380 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
14390 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
143a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
143b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
143c0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
143d0 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
143e0 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
143f0 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
14400 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
14410 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
14420 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
14430 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
14440 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
14450 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
14460 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
14470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14480 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
14490 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
144a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
144b0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
144c0 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
144d0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
144e0 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
144f0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
14500 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
14510 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
14520 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
14530 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
14540 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
14550 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
14560 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
14570 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
145a0 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
145b0 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
145c0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
145d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
145e0 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
145f0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
14600 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
14610 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14620 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14630 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
14640 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
14650 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
14660 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
14670 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
14680 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
14690 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
146a0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
146b0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
146c0 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
146d0 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
146e0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
146f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
14700 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
14710 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
14720 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
14730 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
14740 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
14750 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
14760 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
14770 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
14780 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
14790 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
147a0 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
147b0 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
147c0 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
147d0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
147e0 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
147f0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
14800 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
14810 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
14820 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
14830 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
14840 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
14850 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
14860 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
14870 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
14880 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
14890 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
148a0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
148b0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
148c0 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
148d0 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
148e0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
148f0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
14900 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
14910 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
14920 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
14930 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
14940 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
14950 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
14960 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
14970 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
14980 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
14990 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
149a0 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
149b0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
149c0 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
149d0 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
149e0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76  ->nMem++;..    v
149f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14a00 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
14a10 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
14a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14a30 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
14a40 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
14a50 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
14a60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
14a70 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14a80 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14a90 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
14aa0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
14ab0 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
14ac0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14ad0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14ae0 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
14af0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  0);..    /* Gath
14b00 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
14b10 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
14b20 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
14b30 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
14b40 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
14b50 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
14b60 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
14b70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
14b80 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
14b90 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
14ba0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
14bb0 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
14bc0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
14bd0 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  f("CREATE%s INDE
14be0 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
14bf0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
14c00 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
14c10 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64  E",.        pEnd
14c20 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b  ->z - pName->z +
14c30 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d   1,.        pNam
14c40 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
14c50 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
14c60 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
14c70 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
14c80 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
14c90 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
14ca0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
14cb0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
14cc0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
14cd0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
14ce0 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
14cf0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
14d00 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
14d10 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
14d20 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14d30 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14d40 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
14d50 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
14d60 65 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29  ex',%Q,%Q,#0,%Q)
14d70 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
14d80 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
14d90 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
14da0 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
14db0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
14dc0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
14dd0 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
14de0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
14df0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
14e00 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
14e10 71 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29  qliteFree(zStmt)
14e20 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
14e30 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
14e40 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
14e50 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
14e60 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
14e70 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
14e80 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
14e90 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
14ea0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
14eb0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
14ec0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
14ed0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
14ee0 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
14ef0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14f00 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
14f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14f20 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73  beOp3(v, OP_Pars
14f30 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
14f40 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14f50 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27  3MPrintf("name='
14f60 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  %q'", pIndex->zN
14f70 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43  ame), P3_DYNAMIC
14f80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14f90 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14fa0 45 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20  Expire, 0, 0);. 
14fb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
14fc0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
14fd0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
14fe0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
14ff0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
15000 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
15010 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
15020 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
15030 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
15040 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
15050 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
15060 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
15070 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
15080 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
15090 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
150a0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
150b0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
150c0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
150d0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
150e0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
150f0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
15100 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
15110 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
15120 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
15130 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
15140 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
15150 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
15160 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
15170 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
15180 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
15190 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
151a0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
151b0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
151c0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
151d0 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
151e0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
151f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15200 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
15210 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
15220 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
15230 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
15240 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15250 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
15260 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
15270 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
15280 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15290 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
152a0 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
152b0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
152c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
152d0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
152e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
152f0 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
15300 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
15310 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
15320 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15330 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  code to make sur
15340 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  e the file forma
15350 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c  t number is at l
15360 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a  east minFormat..
15370 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
15380 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65   code will incre
15390 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72  ase the file for
153a0 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65  mat number if ne
153b0 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64  cessary..*/.void
153c0 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46   sqlite3MinimumF
153d0 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20  ileFormat(Parse 
153e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
153f0 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29  , int minFormat)
15400 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76  {.  Vdbe *v;.  v
15410 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15420 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15430 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
15440 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15450 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
15460 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
15470 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15480 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
15490 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
154a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
154b0 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74   OP_Ge, 0, sqlit
154c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
154d0 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c  r(v)+3);.    sql
154e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
154f0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e   OP_Integer, min
15500 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20  Format, 0);.    
15510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15520 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
15530 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , iDb, 1);.  }.}
15540 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
15550 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
15560 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
15570 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
15580 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
15590 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
155a0 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
155b0 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
155c0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
155d0 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
155e0 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ose to contain t
155f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
15600 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
15610 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
15620 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
15630 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
15640 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
15650 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
15660 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
15670 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
15680 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
15690 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
156a0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
156b0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
156c0 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
156d0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
156e0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
156f0 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
15700 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
15710 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e  lar combiniation
15720 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
15730 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
15740 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
15750 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
15760 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
15770 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
15780 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
15790 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
157a0 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
157b0 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
157c0 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
157d0 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
157e0 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
157f0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
15800 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
15810 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
15820 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
15830 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
15840 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
15850 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
15860 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
15870 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
15880 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
15890 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
158a0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
158b0 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49  unsigned *a = pI
158c0 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  dx->aiRowEst;.  
158d0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
158e0 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
158f0 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72  = 1000000;.  for
15900 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (i=pIdx->nColumn
15910 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=5; i--){.  
15920 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a    a[i] = 5;.  }.
15930 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b    while( i>=1 ){
15940 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d  .    a[i] = 11 -
15950 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d   i;.    i--;.  }
15960 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
15970 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
15980 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f  .    a[pIdx->nCo
15990 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d  lumn] = 1;.  }.}
159a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
159b0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
159c0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
159d0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
159e0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
159f0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
15a00 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
15a10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
15a20 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
15a30 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
15a40 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
15a50 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
15a60 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
15a70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15a80 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15a90 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
15aa0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
15ab0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
15ac0 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
15ad0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
15ae0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15af0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
15b00 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
15b10 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
15b20 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
15b30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15b40 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
15b50 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
15b60 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
15b70 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
15b80 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
15b90 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
15ba0 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
15bb0 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
15bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15bd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15be0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
15bf0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
15c00 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
15c10 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
15c20 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15c30 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
15c40 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
15c50 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
15c60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15c70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
15c80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
15c90 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
15ca0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
15cb0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
15cc0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
15cd0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15ce0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
15cf0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
15d00 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
15d10 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
15d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d30 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
15d40 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
15d50 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15d60 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
15d70 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
15d80 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
15d90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
15da0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
15db0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
15dc0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
15dd0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
15de0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15df0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15e00 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
15e10 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
15e20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15e30 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
15e40 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
15e50 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
15e60 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
15e70 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
15e80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15e90 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15ea0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
15eb0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15ec0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15ed0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15ee0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
15ef0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15f00 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15f10 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
15f20 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
15f30 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
15f40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15f50 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15f60 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15f70 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
15f80 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
15f90 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
15fa0 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
15fb0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
15fc0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
15fd0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
15fe0 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
15ff0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
16000 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
16010 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
16020 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
16030 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
16040 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
16050 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16060 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
16070 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d   iDb, 0, pIndex-
16080 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
16090 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
160a0 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
160b0 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b  stDelete(pName);
160c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
160d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
160e0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
160f0 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65  ects.  Each obje
16100 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
16110 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
16120 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68  tes in size.  Th
16130 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
16140 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62  ates a new.** ob
16150 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20  ject on the end 
16160 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a  of the array..**
16170 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20  .** *pnEntry is 
16180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
16190 74 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e  tries already in
161a0 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20   use.  *pnAlloc 
161b0 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  is.** the previo
161c0 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  usly allocated s
161d0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
161e0 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74  .  initSize is t
161f0 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20  he.** suggested 
16200 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69  initial array si
16210 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ze allocation..*
16220 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f  *.** The index o
16230 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
16240 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a  is returned in *
16250 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pIdx..**.** This
16260 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
16270 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
16280 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  e array of objec
16290 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67  ts.  This.** mig
162a0 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
162b0 73 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72  s the pArray par
162c0 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67  ameter or it mig
162d0 68 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e  ht be a differen
162e0 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20  t.** pointer if 
162f0 74 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65  the array was re
16300 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  sized..*/.void *
16310 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
16320 63 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 41  cate(.  void *pA
16330 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
16340 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
16350 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
16360 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
16370 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
16380 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
16390 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
163a0 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a  */.  int initSiz
163b0 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73  e,     /* Sugges
163c0 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f  ted initial allo
163d0 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
163e0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  nts */.  int *pn
163f0 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
16400 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
16410 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
16420 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c   */.  int *pnAll
16430 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  oc,     /* Curre
16440 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  nt size of the a
16450 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
16460 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
16470 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
16480 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
16490 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
164a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
164b0 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e   *z;.  if( *pnEn
164c0 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20  try >= *pnAlloc 
164d0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
164e0 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
164f0 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
16500 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b  = (*pnAlloc)*2 +
16510 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
16520 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
16530 6c 6f 63 28 70 41 72 72 61 79 2c 20 6e 65 77 53  loc(pArray, newS
16540 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20  ize*szEntry);.  
16550 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
16560 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
16570 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
16580 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
16590 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77    *pnAlloc = new
165a0 53 69 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79  Size;.    pArray
165b0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
165c0 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
165d0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70  ;.  memset(&z[*p
165e0 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79  nEntry * szEntry
165f0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
16600 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74    *pIdx = *pnEnt
16610 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  ry;.  ++*pnEntry
16620 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
16630 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
16640 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
16650 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
16660 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
16670 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
16680 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
16690 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
166a0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
166b0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
166c0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
166d0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
166e0 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  end(IdList *pLis
166f0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
16700 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
16710 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
16720 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
16730 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
16740 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
16750 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
16760 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
16770 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
16780 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
16790 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
167a0 61 74 65 28 0a 20 20 20 20 20 20 70 4c 69 73 74  ate(.      pList
167b0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
167c0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
167d0 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26        5,.      &
167e0 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
167f0 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63    &pList->nAlloc
16800 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
16810 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
16820 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
16830 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
16840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16850 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
16860 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
16870 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
16880 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
16890 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
168a0 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
168b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
168c0 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
168d0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
168e0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
168f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
16900 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
16910 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
16920 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
16930 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
16940 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
16950 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
16960 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
16970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16980 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
16990 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
169a0 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
169b0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
169c0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
169d0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
169e0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
169f0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
16a00 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
16a10 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
16a20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
16a30 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
16a40 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
16a50 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
16a60 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
16a70 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
16a80 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
16a90 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
16aa0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
16ab0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
16ac0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
16ad0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
16ae0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
16af0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
16b00 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
16b10 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
16b20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
16b30 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
16b40 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72  new SrcList is r
16b50 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
16b60 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
16b70 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ls..**.** If pDa
16b80 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
16b90 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
16ba0 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
16bb0 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
16bc0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
16bd0 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
16be0 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
16bf0 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
16c00 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
16c10 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
16c20 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
16c30 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
16c40 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
16c50 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
16c60 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
16c70 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
16c80 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
16c90 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
16ca0 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
16cb0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
16cc0 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
16cd0 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
16ce0 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
16cf0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
16d00 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
16d10 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
16d20 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
16d30 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
16d40 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
16d50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
16d60 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
16d70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
16d80 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
16d90 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  end(A,B,0);.**.*
16da0 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
16db0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
16dc0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
16dd0 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
16de0 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
16df0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
16e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
16e10 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43  ListAppend(A,B,C
16e20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
16e30 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
16e40 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
16e50 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f  atabase name..*/
16e60 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
16e70 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53  3SrcListAppend(S
16e80 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
16e90 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f  oken *pTable, To
16ea0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b  ken *pDatabase){
16eb0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
16ec0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16ed0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
16ee0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
16ef0 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
16f00 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
16f10 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16f20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
16f30 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
16f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
16f50 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e  t->nSrc>=pList->
16f60 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
16f70 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
16f80 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a   pList->nAlloc *
16f90 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 2;.    pNew = 
16fa0 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
16fb0 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ist,.           
16fc0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73      sizeof(*pLis
16fd0 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c  t) + (pList->nAl
16fe0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c  loc-1)*sizeof(pL
16ff0 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
17000 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
17020 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  cListDelete(pLis
17030 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
17040 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
17050 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
17060 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
17070 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
17080 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d  ;.  memset(pItem
17090 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
170a0 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28  t->a[0]));.  if(
170b0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
170c0 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
170d0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
170e0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
170f0 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c  atabase && pTabl
17100 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
17110 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
17120 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
17130 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
17140 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
17150 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
17160 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
17170 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29  romToken(pTable)
17180 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
17190 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
171a0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74  meFromToken(pDat
171b0 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d  abase);.  pItem-
171c0 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  >iCursor = -1;. 
171d0 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
171e0 74 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74  ted = 0;.  pList
171f0 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75  ->nSrc++;.  retu
17200 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
17210 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72  ** Assign cursor
17220 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20  s to all tables 
17230 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a  in a SrcList.*/.
17240 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
17250 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
17260 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17270 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
17280 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
17290 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
172a0 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
172b0 28 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65  (pList || sqlite
172c0 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
172d0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
172e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
172f0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
17300 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
17310 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
17320 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
17330 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
17340 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
17350 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17360 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
17370 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
17380 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17390 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
173a0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
173b0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
173c0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
173d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
173e0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
173f0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
17400 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
17410 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
17420 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
17430 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
17440 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
17450 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
17460 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17470 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
17480 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17490 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
174a0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
174b0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
174c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
174d0 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  e(pItem->zDataba
174e0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  se);.    sqliteF
174f0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ree(pItem->zName
17500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
17510 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  e(pItem->zAlias)
17520 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
17530 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
17540 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
17550 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
17560 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
17570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17580 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e  elete(pItem->pOn
17590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
175a0 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d  ListDelete(pItem
175b0 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
175c0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
175d0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
175e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
175f0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
17600 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
17610 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
17620 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
17630 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
17640 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
17650 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
17660 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17670 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
17680 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
17690 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
176a0 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
176b0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
176c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
176d0 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
176e0 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
176f0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
17700 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
17710 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
17720 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
17730 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
17740 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
17750 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
17760 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
17770 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
17780 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
17790 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
177a0 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
177b0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
177c0 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
177d0 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
177e0 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
177f0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
17800 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
17810 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
17820 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
17830 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
17840 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
17850 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
17860 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
17870 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
17880 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
17890 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
178a0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
178b0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
178c0 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
178d0 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
178e0 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
178f0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
17900 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
17910 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
17920 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
17930 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
17940 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
17950 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
17960 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17970 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
17980 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
17990 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
179a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
179b0 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
179c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
179d0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
179e0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
179f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17a00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
17a10 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
17a20 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
17a30 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
17a40 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
17a50 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
17a60 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
17a70 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
17a80 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
17a90 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
17aa0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
17ab0 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
17ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
17ad0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
17ae0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
17af0 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
17b00 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
17b10 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
17b20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
17b30 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17b40 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
17b50 69 73 74 41 70 70 65 6e 64 28 70 2c 20 70 54 61  istAppend(p, pTa
17b60 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
17b70 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
17b80 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
17b90 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
17ba0 74 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  te(pOn);.    sql
17bb0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
17bc0 28 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71  (pUsing);.    sq
17bd0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17be0 65 28 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  e(pSubquery);.  
17bf0 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a    return p;.  }.
17c00 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
17c10 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  p->nSrc-1];.  if
17c20 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69  ( pAlias && pAli
17c30 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
17c40 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
17c50 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17c60 6e 28 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  n(pAlias);.  }. 
17c70 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
17c80 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
17c90 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
17ca0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
17cb0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
17cc0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
17cd0 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70  When building up
17ce0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69   a FROM clause i
17cf0 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  n the parser, th
17d00 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a  e join operator.
17d10 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  ** is initially 
17d20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
17d30 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42  left operand.  B
17d40 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ut the code gene
17d50 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73  rator.** expects
17d60 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
17d70 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20  or to be on the 
17d80 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20  right operand.  
17d90 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
17da0 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20  Shifts all join 
17db0 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c  operators from l
17dc0 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72  eft to right for
17dd0 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a   an entire FROM.
17de0 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ** clause..**.**
17df0 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73   Example: Suppos
17e00 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69  e the join is li
17e10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17e20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72           A natur
17e30 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a  al cross join B.
17e40 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74  **.** The operat
17e50 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63  or is "natural c
17e60 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65  ross join".  The
17e70 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64   A and B operand
17e80 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
17e90 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70  in p->a[0] and p
17ea0 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69  ->a[1], respecti
17eb0 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65  vely.  The parse
17ec0 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72  r initially stor
17ed0 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  es the.** operat
17ee0 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73  or with A.  This
17ef0 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20   routine shifts 
17f00 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76  that operator ov
17f10 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64  er to B..*/.void
17f20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53   sqlite3SrcListS
17f30 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63  hiftJoinType(Src
17f40 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  List *p){.  if( 
17f50 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20  p && p->a ){.   
17f60 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
17f70 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
17f80 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
17f90 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[i].jointype =
17fa0 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74   p->a[i-1].joint
17fb0 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
17fc0 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[0].jointype 
17fd0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
17fe0 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
17ff0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
18000 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
18010 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
18020 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
18030 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18040 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
18050 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  i;..  if( pParse
18060 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
18070 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
18080 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
18090 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
180a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
180b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
180c0 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ed() ) return;. 
180d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
180e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
180f0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
18100 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
18110 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
18120 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18130 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18140 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
18150 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
18160 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
18170 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
18180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
18190 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
181a0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
181b0 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
181c0 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
181d0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
181e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
181f0 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
18200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
18210 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
18220 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
18230 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
18240 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
18250 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18260 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
18270 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
18280 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
18290 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
182a0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
182b0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
182c0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  Err || sqlite3Ma
182d0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72  llocFailed() ) r
182e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
182f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
18300 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
18310 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
18320 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  T", 0, 0) ) retu
18330 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
18340 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
18350 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18370 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
18380 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
18390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
183a0 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
183b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
183c0 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
183d0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
183e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
183f0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
18400 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
18410 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
18420 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
18430 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
18440 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
18450 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
18460 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
18470 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
18480 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18490 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
184a0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
184b0 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
184c0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
184d0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
184e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
184f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18500 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
18510 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
18520 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
18530 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
18540 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
18550 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
18560 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
18570 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
18580 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
18590 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
185a0 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
185b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
185c0 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
185d0 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
185e0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
185f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
18600 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
18610 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
18620 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
18630 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
18640 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
18650 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c  actory(db, 0, 0,
18660 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18670 43 41 43 48 45 5f 53 49 5a 45 2c 0a 20 20 20 20  CACHE_SIZE,.    
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 62               &db
186a0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
186b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
186c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
186d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
186e0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
186f0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
18700 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
18710 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
18720 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
18730 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
18740 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
18750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
18760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18770 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
18780 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
18790 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
187a0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
187b0 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
187c0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
187d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
187e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
187f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18800 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
18810 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
18820 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
18830 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
18840 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
18850 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
18860 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  rc;.        retu
18870 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
18880 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18890 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
188a0 6d 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ma );.  }.  retu
188b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
188c0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
188d0 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
188e0 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
188f0 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
18900 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
18910 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
18920 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
18930 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
18940 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
18950 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
18960 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
18970 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
18980 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
18990 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
189a0 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
189b0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
189c0 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
189d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
189e0 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
189f0 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
18a00 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
18a10 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
18a20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
18a30 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
18a40 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
18a50 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
18a60 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
18a70 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
18a80 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
18a90 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
18aa0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
18ab0 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
18ac0 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
18ad0 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
18ae0 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
18af0 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
18b00 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
18b10 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
18b20 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
18b30 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
18b40 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
18b50 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
18b60 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
18b70 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
18b80 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
18b90 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
18ba0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
18bb0 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
18bc0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
18bd0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
18be0 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
18bf0 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
18c00 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
18c10 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
18c20 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
18c30 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
18c40 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
18c50 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
18c60 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
18c70 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
18c80 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
18c90 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
18ca0 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
18cb0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
18cc0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
18cd0 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
18ce0 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
18cf0 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
18d00 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
18d10 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
18d20 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
18d30 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
18d40 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
18d50 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
18d60 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
18d70 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
18d80 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
18d90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18da0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
18db0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
18dc0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
18dd0 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
18de0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
18df0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
18e00 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
18e10 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
18e20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
18e30 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
18e40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
18e50 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
18e60 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
18e70 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
18e80 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
18e90 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
18ea0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
18eb0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
18ec0 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
18ed0 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
18ee0 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44      mask = 1<<iD
18ef0 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72  b;.    if( (pPar
18f00 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
18f10 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
18f20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
18f30 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
18f40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
18f50 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
18f60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
18f70 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
18f80 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  kie;.      if( !
18f90 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
18fa0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
18fb0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
18fc0 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29  Database(pParse)
18fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18fe0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
18ff0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
19000 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
19010 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
19020 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
19030 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
19040 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
19050 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
19060 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
19070 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
19080 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
19090 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
190a0 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
190b0 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
190c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
190d0 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
190e0 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
190f0 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61  etStatement para
19100 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
19110 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
19120 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
19130 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
19140 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
19150 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
19160 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
19170 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
19180 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
19190 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
191a0 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
191b0 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
191c0 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
191d0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
191e0 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
191f0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
19200 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
19210 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
19220 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
19230 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
19240 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
19250 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
19260 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
19270 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
19280 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
19290 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61  *.** Only databa
192a0 73 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74  se iDb and the t
192b0 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
192c0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62   made writable b
192d0 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20  y this call..** 
192e0 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20  If iDb==0, then 
192f0 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d  the main and tem
19300 70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  p databases are 
19310 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
19320 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68   If.** iDb==1 th
19330 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70  en only the temp
19340 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64   database is mad
19350 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20  e writable.  If 
19360 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a  iDb>1 then the.*
19370 2a 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69  * specified auxi
19380 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61  liary database a
19390 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
193a0 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
193b0 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  itable..*/.void 
193c0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
193d0 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
193e0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
193f0 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
19400 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
19410 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19420 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
19430 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
19440 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
19450 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
19460 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d   iDb);.  pParse-
19470 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c  >writeMask |= 1<
19480 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53  <iDb;.  if( setS
19490 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72  tatement && pPar
194a0 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
194b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
194c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74  AddOp(v, OP_Stat
194d0 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  ement, iDb, 0);.
194e0 20 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f    }.  if( (OMIT_
194f0 54 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31  TEMPDB || iDb!=1
19500 29 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d  ) && pParse->db-
19510 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29  >aDb[1].pBt!=0 )
19520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
19530 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
19540 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74  (pParse, setStat
19550 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d  ement, 1);.  }.}
19560 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
19570 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
19580 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
19590 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
195a0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
195b0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
195c0 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
195d0 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
195e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
195f0 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
19600 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
19610 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
19620 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
19630 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
19640 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
19650 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
19660 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19670 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  z = pIndex->azCo
19680 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  ll[i];.    if( z
19690 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26  ==zColl || (z &&
196a0 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c   zColl && 0==sql
196b0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
196c0 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20  Coll)) ){.      
196d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
196e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
196f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19700 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
19710 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
19720 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
19730 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
19740 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
19750 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
19760 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
19770 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
19780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
19790 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
197a0 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
197b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
197c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
197d0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
197e0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19800 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
19810 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
19820 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
19830 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
19840 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
19850 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
19860 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
19870 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
19880 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
19890 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
198a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
198b0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
198c0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
198d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
198e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
198f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
19900 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
19910 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
19920 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
19930 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
19940 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
19950 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
19960 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
19970 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
19980 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
19990 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
199a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
199b0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
199c0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
199d0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
199e0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
199f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19a00 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
19a10 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
19a20 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
19a30 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
19a40 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
19a50 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a70 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
19a80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
19ab0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
19ac0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
19ad0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
19ae0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
19af0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
19b00 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
19b30 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
19b40 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
19b70 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
19b80 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
19b90 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
19ba0 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
19bb0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
19bc0 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
19bd0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
19be0 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
19bf0 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
19c00 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
19c10 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
19c20 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
19c30 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
19c40 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
19c50 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
19c60 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
19c70 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
19c80 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19c90 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
19ca0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
19cb0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
19ce0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
19cf0 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
19d00 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
19d10 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
19d20 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
19d30 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
19d40 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
19d50 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
19d60 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
19d70 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
19d80 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
19d90 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
19da0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
19db0 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
19dc0 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
19dd0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
19de0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
19df0 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
19e00 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
19e10 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
19e20 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
19e30 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
19e40 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
19e50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19e60 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
19e70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
19e80 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
19e90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
19ea0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
19eb0 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
19ec0 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
19ed0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
19ee0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
19ef0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
19f00 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
19f10 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
19f20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
19f50 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
19f60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19f70 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
19f80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
19f90 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
19fa0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
19fb0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
19fc0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
19fd0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
19fe0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
19ff0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
1a000 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1a010 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
1a020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a030 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1a040 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
1a050 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
1a060 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a070 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1a080 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1a090 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
1a0a0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
1a0b0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
1a0c0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
1a0d0 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
1a0e0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
1a0f0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
1a100 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1a110 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
1a120 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
1a130 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
1a140 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
1a150 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
1a160 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1a170 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1a180 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1a190 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
1a1a0 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d  e1==0 || pName1-
1a1b0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  >z==0 ){.    rei
1a1c0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
1a1d0 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
1a1e0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
1a1f0 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70  ( pName2==0 || p
1a200 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
1a210 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
1a220 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 70 43 6f 6c  1->z );.    pCol
1a230 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1a240 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
1a250 62 29 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65  b), (char*)pName
1a260 31 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c  1->z, pName1->n,
1a270 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
1a280 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ll ){.      char
1a290 20 2a 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *zColl = sqlite
1a2a0 53 74 72 4e 44 75 70 28 28 63 6f 6e 73 74 20 63  StrNDup((const c
1a2b0 68 61 72 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c  har *)pName1->z,
1a2c0 20 70 4e 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20   pName1->n);.   
1a2d0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1a2e0 20 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44          reindexD
1a2f0 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1a300 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   zColl);.       
1a310 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
1a320 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1a330 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1a340 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1a350 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1a360 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
1a370 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
1a380 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
1a390 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
1a3a0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1a3b0 6b 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  ken(pObjName);. 
1a3c0 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
1a3d0 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
1a3e0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
1a3f0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
1a400 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
1a410 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
1a420 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
1a430 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
1a440 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
1a450 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 72  teFree(z);.    r
1a460 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
1a470 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1a480 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
1a490 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
1a4a0 28 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  (z);.  if( pInde
1a4b0 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
1a4c0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1a4d0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
1a4e0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1a4f0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1a500 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1a510 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1a520 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
1a530 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1a540 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
1a550 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
1a560 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
1a570 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1a580 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20  urn a dynamicly 
1a590 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66  allocated KeyInf
1a5a0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
1a5b0 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
1a5c0 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64  with OP_OpenRead
1a5d0 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65   or OP_OpenWrite
1a5e0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62   to access datab
1a5f0 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  ase index pIdx..
1a600 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1a610 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  ful, a pointer t
1a620 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74  o the new struct
1a630 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ure is returned.
1a640 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
1a650 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1a660 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1a670 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 46 72 65  alling sqliteFre
1a680 65 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  e() on the retur
1a690 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  ned .** pointer.
1a6a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1a6b0 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  urs (out of memo
1a6c0 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f  ry or missing co
1a6d0 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75  llation .** sequ
1a6e0 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72  ence), NULL is r
1a6f0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1a700 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20  state of pParse 
1a710 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
1a720 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  ct.** the error.
1a730 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
1a740 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
1a750 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a760 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1a770 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
1a780 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
1a790 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20  n;.  int nBytes 
1a7a0 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
1a7b0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
1a7c0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
1a7d0 6e 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  nCol;.  KeyInfo 
1a7e0 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1a7f0 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
1a800 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20  nBytes);..  if( 
1a810 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79  pKey ){.    pKey
1a820 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
1a830 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f  u8 *)&(pKey->aCo
1a840 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61  ll[nCol]);.    a
1a850 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53  ssert( &pKey->aS
1a860 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d  ortOrder[nCol]==
1a870 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e  &(((u8 *)pKey)[n
1a880 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66  Bytes]) );.    f
1a890 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1a8a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
1a8b0 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
1a8c0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1a8d0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
1a8e0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
1a8f0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1a900 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1a910 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
1a920 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
1a930 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
1a940 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
1a950 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
1a960 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  y->nField = nCol
1a970 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1a980 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1a990 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79   sqliteFree(pKey
1a9a0 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  );.    pKey = 0;
1a9b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
1a9c0 65 79 3b 0a 7d 0a                                ey;.}.