/ Hex Artifact Content
Login

Artifact 83ae5b1f806e7abe323e9c6d32c9e80a5bab1ad7:


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 32 38 20 32 30 30 37 2f 30 35 2f 30 38  1.428 2007/05/08
02f0: 20 32 30 3a 33 37 3a 33 39 20 64 72 68 20 45 78   20:37:39 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 20 20 20 20 46 49 4c 45 20 2a 74 72 61  ){.    FILE *tra
1760: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
1770: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
1780: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
1790: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
17a0: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
17b0: 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
17c0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
17d0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70   pParse->nVar, p
17e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20  Parse->nMem+3,. 
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1810: 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e  nTab+3, pParse->
1820: 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50  explain);.    pP
1830: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1840: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
1850: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
1860: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
1870: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
1880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1890: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
18a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
18b0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
18c0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
18d0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
18e0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
18f0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
1900: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1910: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
1920: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
1930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1940: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1950: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1960: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1970: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1980: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1990: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
19a0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
19b0: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
19c0: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
19d0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19e0: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
19f0: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1a00: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1a10: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1a20: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1a30: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1a40: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1a50: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1a60: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1a70: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
1a80: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
1a90: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
1aa0: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
1ab0: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
1ac0: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
1ad0: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
1ae0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
1af0: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
1b00: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1b10: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
1b20: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
1b30: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
1b40: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
1b50: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
1b60: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
1b70: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1b80: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1b90: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
1ba0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1bb0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1bc0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1bd0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1be0: 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  Sql;.# define SA
1bf0: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1c00: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1c10: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1c20: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1c30: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1c40: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1c50: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1c60: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1c70: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1c80: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1c90: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1ca0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1cb0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1cc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1cd0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
1ce0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1cf0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1d00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1d10: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1d20: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1d30: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1d40: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1d50: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1d60: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1d70: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1d80: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1d90: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1da0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1db0: 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73  e, zSql, 0);.  s
1dc0: 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c 29 3b  qliteFree(zSql);
1dd0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1de0: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1df0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1e00: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1e20: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1e30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1e40: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1e50: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1e60: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1e70: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1e80: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1e90: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1ea0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1eb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1ec0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1ed0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1ee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1ef0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1f00: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1f10: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1f20: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1f30: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1f40: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1f50: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1f60: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1f70: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1f80: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1f90: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1fa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1fb0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1fc0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1fd0: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1fe0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1ff0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2000: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2010: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
2020: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2030: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2040: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2060: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2070: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2080: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  ;.  assert( zNam
2090: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
20a0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
20b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20c0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
20d0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
20e0: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
20f0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
2100: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
2110: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2120: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2130: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2140: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
2150: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2160: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
2170: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2180: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
2190: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
21a0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
21b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
21c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
21d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
21e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
21f0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2200: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2210: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2220: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2230: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2240: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2250: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2260: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2270: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2280: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
2290: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
22a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
22b0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
22c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
22d0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
22f0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2300: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2310: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2320: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2330: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2340: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
2350: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2360: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
2370: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2380: 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ateTable(Parse *
2390: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
23a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
23b0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a   char *zDbase){.
23c0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
23d0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
23e0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
23f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2400: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2410: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2420: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2430: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2440: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2450: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2460: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2470: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2480: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2490: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
24a0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
24b0: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
24c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62  0 ){.    if( zDb
24d0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
24e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24f0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2500: 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62  ble: %s.%s", zDb
2510: 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ase, zName);.   
2520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2540: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
2550: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  able: %s", zName
2560: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2570: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
2580: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
2590: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
25a0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
25b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
25c0: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
25d0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
25e0: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
25f0: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
2600: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
2610: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2620: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2630: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
2640: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2650: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2660: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2670: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2680: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2690: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
26a0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
26b0: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
26c0: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
26d0: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
26e0: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
26f0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
2700: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
2710: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
2720: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
2730: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
2740: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
2750: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
2760: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
2770: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
2780: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
27a0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
27b0: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
27c0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
27d0: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
27e0: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
27f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
2800: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2810: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
2820: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2830: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
2840: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2850: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
2860: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
2870: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
2880: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2890: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28a0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
28b0: 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64 62   || (j==1 && !db
28c0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b  ->aDb[1].pBt) );
28d0: 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61  .    if( pSchema
28e0: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71   ){.      p = sq
28f0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
2900: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2910: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
2920: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  Name)+1);.    }.
2930: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2940: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2950: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
2960: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
2970: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
2980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2990: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
29a0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p){.  sqliteFree
29b0: 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  (p->zColAff);.  
29c0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
29d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
29e0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
29f0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
2a00: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
2a10: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
2a20: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
2a30: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
2a40: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2a50: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
2a60: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
2a70: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
2a80: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
2a90: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
2aa0: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
2ab0: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
2ac0: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
2ad0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2af0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
2b00: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
2b10: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63  Index *pOld;.  c
2b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2b30: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20   = p->zName;..  
2b40: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2b50: 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
2b60: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2b70: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e  Name, strlen( zN
2b80: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73  ame)+1, 0);.  as
2b90: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c  sert( pOld==0 ||
2ba0: 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72   pOld==p );.  fr
2bb0: 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f  eeIndex(p);.}../
2bc0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
2bd0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
2be0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
2bf0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2c00: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
2c10: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
2c20: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
2c30: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
2c40: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
2c50: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
2c60: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
2c70: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
2c80: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
2c90: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
2ca0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
2cb0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
2cc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2cd0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
2ce0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
2cf0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69  dex *pIndex;.  i
2d00: 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a  nt len;.  Hash *
2d10: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
2d20: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
2d30: 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d  dxHash;..  len =
2d40: 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65   strlen(zIdxName
2d50: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
2d60: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2d70: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
2d80: 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66   len+1, 0);.  if
2d90: 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
2da0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
2db0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
2dc0: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
2dd0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2de0: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
2df0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
2e00: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
2e10: 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65       for(p=pInde
2e20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
2e30: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
2e40: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
2e50: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66  Next){}.      if
2e60: 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  ( p && p->pNext=
2e70: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
2e80: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
2e90: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
2ea0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2eb0: 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  reeIndex(pIndex)
2ec0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
2ed0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
2ee0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
2ef0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
2f00: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
2f10: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
2f20: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2f30: 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64  of.** a single d
2f40: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
2f50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f60: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
2f70: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
2f80: 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73   database closes
2f90: 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61  .  It is also ca
2fa0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f  lled during a ro
2fb0: 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65  llback.** if the
2fc0: 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63  re were schema c
2fd0: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
2fe0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2ff0: 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d   if a.** schema-
3000: 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20  cookie mismatch 
3010: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
3020: 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73   iDb<=0 then res
3030: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
3040: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f  schema tables fo
3050: 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
3060: 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62  * files.  If iDb
3070: 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74  >=2 then reset t
3080: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
3090: 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a  ma for only the.
30a0: 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69  ** single file i
30b0: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ndicated..*/.voi
30c0: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e  d sqlite3ResetIn
30d0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c  ternalSchema(sql
30e0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
30f0: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3100: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
3110: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
3120: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b   );.  for(i=iDb;
3130: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3140: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
3150: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3160: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
3170: 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
3180: 65 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62  e3SchemaFree(pDb
3190: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
31a0: 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  }.    if( iDb>0 
31b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
31c0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
31d0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
31e0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
31f0: 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  hanges;..  /* If
3200: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3210: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3220: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
3230: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
3240: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
3250: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
3260: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3270: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3280: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3290: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
32a0: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
32b0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
32c0: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
32d0: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
32e0: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
32f0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3300: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3310: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
3320: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
3330: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
3340: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3350: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3360: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3370: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3390: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
33a0: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
33b0: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
33c0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
33d0: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
33e0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
33f0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3400: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3410: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3420: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3430: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3440: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3450: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3460: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3470: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3490: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
34a0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
34b0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
34c0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
34d0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
34e0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
34f0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3500: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3510: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3520: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3530: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3540: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3550: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3560: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3570: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3580: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
3590: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
35a0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
35b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
35c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
35d0: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
35e0: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
35f0: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
3600: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
3610: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
3620: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3630: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3640: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  s;.}../*.** Clea
3650: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
3660: 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  es from a table 
3670: 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74  or view..*/.stat
3680: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65  ic void sqliteRe
3690: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54  setColumnNames(T
36a0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
36b0: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
36c0: 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74   *pCol;.  assert
36d0: 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20  ( pTable!=0 );. 
36e0: 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61   if( (pCol = pTa
36f0: 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b  ble->aCol)!=0 ){
3700: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3710: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
3720: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
3730: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
3740: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
3750: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3760: 74 65 28 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  te(pCol->pDflt);
3770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
3780: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
3790: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
37a0: 28 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20  (pCol->zColl);. 
37b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
37c0: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
37d0: 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d  );.  }.  pTable-
37e0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  >aCol = 0;.  pTa
37f0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d  ble->nCol = 0;.}
3800: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
3810: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
3820: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3830: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3840: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
3850: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
3860: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
3870: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
3880: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
3890: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
38a0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
38b0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
38c0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
38d0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
38e0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
38f0: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
3900: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
3910: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
3920: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
3930: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
3940: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
3950: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
3960: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
3970: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
3980: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
3990: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
39a0: 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
39b0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 54  te3DeleteTable(T
39c0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
39d0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
39e0: 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a  *pNext;.  FKey *
39f0: 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65  pFKey, *pNextFKe
3a00: 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  y;..  if( pTable
3a10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
3a20: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
3a30: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
3a40: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
3a50: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
3a60: 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65 2d  ro. */.  pTable-
3a70: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
3a80: 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 7b  Table->nRef>0 ){
3a90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3aa0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3ab0: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
3ac0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
3ad0: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
3ae0: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
3af0: 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  e.  */.  for(pIn
3b00: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
3b10: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
3b20: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
3b30: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
3b40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
3b50: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
3b60: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
3b70: 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
3b80: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 70 49  teDeleteIndex(pI
3b90: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  ndex);.  }..#ifn
3ba0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3bb0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a  FOREIGN_KEY.  /*
3bc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65   Delete all fore
3bd0: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
3be0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3bf0: 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20  ble.  The keys. 
3c00: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
3c10: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c  already been unl
3c20: 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 70  inked from the p
3c30: 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79 20 68 61  Schema->aFKey ha
3c40: 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20  sh table .  */. 
3c50: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
3c60: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
3c70: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
3c80: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
3c90: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
3ca0: 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rom;.    assert(
3cb0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
3cc0: 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  (&pTable->pSchem
3cd0: 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20 20  a->aFKey,.      
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
3d00: 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a   strlen(pFKey->z
3d10: 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b  To)+1)!=pFKey );
3d20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3d30: 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64  pFKey);.  }.#end
3d40: 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  if..  /* Delete 
3d50: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
3d60: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
3d70: 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f  .  sqliteResetCo
3d80: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c 65  lumnNames(pTable
3d90: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3da0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
3db0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
3dc0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
3dd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
3de0: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
3df0: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
3e00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
3e10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3e20: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
3e30: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
3e40: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
3e50: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3e60: 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d  eFree(pTable);.}
3e70: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
3e80: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
3e90: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
3ea0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
3eb0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
3ec0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
3ed0: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
3ee0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
3ef0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3f00: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
3f10: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
3f20: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
3f30: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29   char *zTabName)
3f40: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
3f50: 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b  FKey *pF1, *pF2;
3f60: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
3f70: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
3f80: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
3f90: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
3fa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
3fb0: 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d  bName && zTabNam
3fc0: 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20  e[0] );.  pDb = 
3fd0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
3fe0: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3ff0: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
4000: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
4010: 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  TabName, strlen(
4020: 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a  zTabName)+1,0);.
4030: 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66 6e 64    if( p ){.#ifnd
4040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
4050: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66  OREIGN_KEY.    f
4060: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
4070: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
4080: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
4090: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
40a0: 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  n(pF1->zTo) + 1;
40b0: 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c  .      pF2 = sql
40c0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44  ite3HashFind(&pD
40d0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  b->pSchema->aFKe
40e0: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
40f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 32  );.      if( pF2
4100: 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20  ==pF1 ){.       
4110: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4120: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
4130: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
4140: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
4150: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
4160: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
4170: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
4180: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
4190: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
41a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
41b0: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
41c0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
41d0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
41e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
41f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4200: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4210: 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  le(p);.  }.  db-
4220: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4230: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4240: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4250: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4260: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4270: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4280: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4290: 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74  en with any quot
42a0: 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20  ations removed. 
42b0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
42c0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
42d0: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
42e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
42f0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
4300: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
4310: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
4320: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  on..**.** Tokens
4330: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
4340: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
4350: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
4360: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
4370: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
4380: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
4390: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
43a0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
43b0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
43c0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
43d0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
43e0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
43f0: 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20  FromToken(Token 
4400: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
4410: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
4420: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
4430: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
4440: 28 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a  ((char*)pName->z
4450: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
4460: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
4470: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
4480: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
4490: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
44a0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
44b0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
44c0: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
44d0: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
44e0: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
44f0: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
4500: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
4510: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
4520: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
4530: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
4540: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
4550: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
4560: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
4570: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
4580: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
4590: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
45a0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
45b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
45c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
45d0: 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  Db, 0);.  sqlite
45e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
45f0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
4600: 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73  ASTER_ROOT);.  s
4610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4620: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
4630: 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73  mns, 0, 5); /* s
4640: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73  qlite_master has
4650: 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a   5 columns */.}.
4660: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
4670: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
4680: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
4690: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
46a0: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
46b0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
46c0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
46d0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
46e0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
46f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
4700: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4710: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
4720: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
4730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
4740: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
4750: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
4760: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
4770: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
4780: 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  1;    /* Databas
4790: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
47a0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
47b0: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
47c0: 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65  ters in the name
47d0: 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20   */.  Db *pDb;  
47e0: 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61 62 61       /* A databa
47f0: 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20 73 70  se whose name sp
4800: 61 63 65 20 69 73 20 62 65 69 6e 67 20 73 65 61  ace is being sea
4810: 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  rched */.  char 
4820: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
4830: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
4840: 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a 4e 61  ng for */..  zNa
4850: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4860: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
4870: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
4880: 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28  .    n = strlen(
4890: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
48a0: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
48b0: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
48c0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
48d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
48e0: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
48f0: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 74 72 6c 65  =1 ) && n==strle
4900: 6e 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  n(pDb->zName) &&
4910: 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
4920: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44  qlite3StrICmp(pD
4930: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  b->zName, zName)
4940: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4950: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4960: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4970: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  zName);.  }.  re
4980: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn i;.}../* Th
4990: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
49a0: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
49b0: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
49c0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
49d0: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
49e0: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
49f0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
4a00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4a10: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
4a20: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4a30: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
4a40: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
4a50: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
4a60: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
4a70: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
4a80: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
4a90: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
4aa0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
4ab0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
4ac0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
4ad0: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
4ae0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4af0: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
4b00: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
4b10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
4b20: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
4b30: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
4b40: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
4b50: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
4b60: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
4b70: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
4b80: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
4b90: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
4ba0: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
4bb0: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
4bc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
4bd0: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
4be0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4bf0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
4c00: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
4c10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
4c20: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
4c30: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
4c40: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
4c50: 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20  y" or "xxx" */. 
4c60: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
4c70: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79       /* The "yyy
4c80: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
4c90: 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b  xx.yyy" */.  Tok
4ca0: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20  en **pUnqual    
4cb0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e   /* Write the un
4cc0: 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74  qualified object
4cd0: 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b   name here */.){
4ce0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d00: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
4d10: 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f  ng the object */
4d20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4d30: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
4d40: 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
4d50: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
4d60: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
4d70: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a  it.busy );.    *
4d80: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
4d90: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
4da0: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
4db0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
4dc0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
4dd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4de0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
4df0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
4e00: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
4e10: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
4e20: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
4e30: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
4e40: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
4e50: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
4e60: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
4e70: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
4e80: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
4e90: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
4ea0: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
4eb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4ec0: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
4ed0: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
4ee0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
4ef0: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
4f00: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
4f10: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
4f20: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
4f30: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
4f40: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
4f50: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
4f60: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
4f70: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
4f80: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
4f90: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
4fa0: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
4fb0: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
4fc0: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
4fd0: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
4fe0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
4ff0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5000: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
5010: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
5020: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5030: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
5040: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
5050: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
5060: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
5070: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
5080: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
5090: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
50a0: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
50b0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
50c0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
50d0: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
50e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
50f0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
5100: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5110: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
5120: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
5130: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
5140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5150: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5160: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
5170: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
5180: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5190: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
51a0: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
51b0: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
51c0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
51d0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
51e0: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
51f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5200: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
5210: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
5220: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
5230: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
5240: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
5250: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
5260: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
5270: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
5280: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
5290: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
52a0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
52b0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
52c0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
52d0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
52e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
52f0: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
5300: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
5310: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
5320: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
5330: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
5340: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
5350: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
5360: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
5370: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
5380: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
5390: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
53a0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
53b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
53c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
53d0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
53e0: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
53f0: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
5400: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
5410: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
5420: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
5430: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
5440: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5450: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
5460: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
5470: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
5480: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
5490: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
54a0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
54b0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
54c0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
54d0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
54e0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
54f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
5500: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5510: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
5520: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
5530: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5540: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5550: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
5560: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
5570: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
5580: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
5590: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
55a0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
55b0: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
55c0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
55d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
55e0: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
55f0: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
5600: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
5610: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
5620: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
5630: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
5640: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
5650: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
5660: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
5670: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
5680: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
5690: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
56a0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
56b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
56c0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
56d0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
56e0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
56f0: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
5700: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
5710: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5720: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
5730: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
5740: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
5750: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
5760: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
5770: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
5780: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5790: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
57a0: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
57b0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
57c0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
57d0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
57e0: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
57f0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5800: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5810: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
5820: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5830: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5840: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5850: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
5860: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
5870: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5880: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5890: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
58a0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
58b0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
58c0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
58d0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
58e0: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
58f0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
5900: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
5910: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
5920: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5930: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
5940: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
5950: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
5960: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
5970: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
5980: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
5990: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
59a0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
59b0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
59c0: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
59d0: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
59e0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
59f0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
5a00: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
5a10: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
5a20: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
5a30: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
5a40: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
5a50: 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f  & iDb>1 ){.    /
5a60: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
5a70: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
5a80: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
5a90: 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20  qualified */.   
5aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5ab0: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
5ac0: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
5ad0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
5ae0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
5af0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49  ;.  }.  if( !OMI
5b00: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5b10: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
5b20: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
5b30: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
5b40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5b50: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
5b60: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
5b70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5b80: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
5b90: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
5ba0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
5bb0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
5bc0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5bd0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
5be0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
5bf0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
5c00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5c10: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
5c20: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
5c30: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
5c40: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
5c50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
5c60: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
5c70: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
5c80: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5c90: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
5ca0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
5cb0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
5cc0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5cd0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5ce0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
5cf0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
5d00: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
5d10: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
5d20: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5d30: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5d40: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
5d50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5d60: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5d70: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
5d80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5d90: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5da0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
5db0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5dc0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5dd0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
5de0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5df0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5e00: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
5e10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5e20: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
5e30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5e40: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
5e50: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
5e60: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5e70: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5e80: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
5e90: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
5ea0: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
5eb0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
5ec0: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
5ed0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
5ee0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
5ef0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5f00: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
5f10: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
5f20: 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65  * it does. The e
5f30: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
5f40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  he statement bei
5f50: 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61  ng parsed was pa
5f60: 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20  ssed.  ** to an 
5f70: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
5f80: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20  vtab() call. In 
5f90: 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74  that case only t
5fa0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  he column names.
5fb0: 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77    ** and types w
5fc0: 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20  ill be used, so 
5fd0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
5fe0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d   to test for nam
5ff0: 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c  espace.  ** coll
6000: 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  isions..  */.  i
6010: 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  f( !IN_DECLARE_V
6020: 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53  TAB ){.    if( S
6030: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6040: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
6050: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6060: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6070: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6080: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6090: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
60a0: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
60b0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
60c0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
60d0: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
60e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
60f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6100: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
6110: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
6120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6130: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6140: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6150: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
6160: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
6170: 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d  , 0)!=0 && (iDb=
6180: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
6190: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
61a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
61b0: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
61c0: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
61d0: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
61e0: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
61f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6200: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
6210: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
6220: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
6230: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
6240: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  able==0 ){.    p
6250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
6260: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
6270: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6280: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6290: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
62a0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
62b0: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
62c0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
62d0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
62e0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
62f0: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
6300: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28  >nRef = 1;.  if(
6310: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6320: 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65  le ) sqlite3Dele
6330: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  teTable(pParse->
6340: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
6350: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
6360: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
6370: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
6380: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
6390: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
63a0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
63b0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
63c0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
63d0: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
63e0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
63f0: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
6400: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
6410: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
6420: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
6430: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6440: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
6450: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
6460: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
6470: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
6480: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
6490: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
64a0: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
64b0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
64c0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
64d0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
64e0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
64f0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
6500: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
6510: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
6520: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
6530: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
6540: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
6550: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
6560: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
6570: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6580: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
6590: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
65a0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
65b0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
65c0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
65d0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
65e0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
65f0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
6600: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
6610: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
6620: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
6630: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
6640: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
6650: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
6660: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
6670: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
6680: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
6690: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
66a0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
66b0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
66c0: 20 69 6e 74 20 6c 62 6c 3b 0a 20 20 20 20 69 6e   int lbl;.    in
66d0: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
66e0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
66f0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
6700: 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23  rse, 0, iDb);..#
6710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6720: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
6730: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
6740: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
6750: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6760: 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 29 3b  P_VBegin, 0, 0);
6770: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
6780: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
6790: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
67a0: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
67b0: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
67c0: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
67d0: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
67e0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
67f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6800: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
6810: 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f  , 1);   /* file_
6820: 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 6c 62  format */.    lb
6830: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
6840: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
6850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6860: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 6c  p(v, OP_If, 0, l
6870: 62 6c 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  bl);.    fileFor
6880: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
6890: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
68a0: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
68d0: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
68e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
68f0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6900: 66 69 6c 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a  fileFormat, 0);.
6910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6920: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6930: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
6940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6950: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6960: 72 2c 20 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a  r, ENC(db), 0);.
6970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6980: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6990: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20  okie, iDb, 4);. 
69a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
69b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
69c0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  l);..    /* This
69d0: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
69e0: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
69f0: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
6a00: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
6a10: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
6a20: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
6a30: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
6a40: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
6a50: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
6a60: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
6a70: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
6a80: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
6a90: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
6aa0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6ab0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
6ac0: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
6ad0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
6ae0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
6af0: 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   The rowid value
6b00: 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68   is needed by th
6b10: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
6b20: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
6b30: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
6b40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
6b50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6b60: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
6b70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6b80: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
6b90: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
6ba0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6bc0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6bd0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  r, 0, 0);.    }e
6be0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
6bf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6c00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
6c10: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
6c20: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6c30: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6c40: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
6c50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6c60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
6c70: 77 52 6f 77 69 64 2c 20 30 2c 20 30 29 3b 0a 20  wRowid, 0, 0);. 
6c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c90: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
6ca0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6cb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6cc0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
6cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ce0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
6cf0: 20 30 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e   0, OPFLAG_APPEN
6d00: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
6d10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
6d20: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
6d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d40: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
6d50: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e   0);.  }..  /* N
6d60: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
6d70: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
6d80: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
6d90: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
6da0: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
6db0: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
6dc0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  or:.  sqliteFree
6dd0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  (zName);.  retur
6de0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
6df0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
6e00: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
6e10: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
6e20: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
6e30: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
6e40: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
6e50: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
6e60: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
6e70: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
6e80: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
6e90: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
6ea0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
6eb0: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
6ec0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
6ed0: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
6ee0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
6ef0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
6f00: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
6f10: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
6f20: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
6f30: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
6f40: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
6f50: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
6f60: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
6f70: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
6f80: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
6f90: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
6fa0: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
6fb0: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
6fc0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
6fd0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
6fe0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
6ff0: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
7000: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
7010: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
7020: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
7030: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
7040: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
7050: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7060: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
7070: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
7080: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
7090: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
70a0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
70b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
70c0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
70d0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
70e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
70f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7100: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
7110: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7120: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
7130: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
7140: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
7150: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
7160: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43  urn;.  if( p->nC
7170: 6f 6c 2b 31 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  ol+1>SQLITE_MAX_
7180: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71  COLUMN ){.    sq
7190: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
71a0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
71b0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
71c0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
71d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
71e0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
71f0: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
7200: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
7210: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
7220: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
7230: 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a     if( STRICMP(z
7240: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
7250: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
7260: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7270: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
7280: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
7290: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
72a0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
72b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
72c0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
72d0: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
72e0: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
72f0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
7300: 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43  teRealloc( p->aC
7310: 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  ol, (p->nCol+8)*
7320: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
7330: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
7340: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
7350: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
7360: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7370: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
7380: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
7390: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
73a0: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
73b0: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
73c0: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
73d0: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
73e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
73f0: 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66  s no type specif
7400: 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76  ied, columns hav
7410: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66  e the default af
7420: 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e  finity.  ** 'NON
7430: 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  E'. If there is 
7440: 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  a type specified
7450: 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64  , then sqlite3Ad
7460: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69  dColumnType() wi
7470: 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  ll.  ** be calle
7480: 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43  d next to set pC
7490: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72  ol->affinity cor
74a0: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70  rectly..  */.  p
74b0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
74c0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
74d0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
74e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
74f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
7500: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
7510: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
7520: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
7530: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7540: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
7550: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
7560: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
7570: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
7580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
7590: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
75a0: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
75b0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
75c0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
75d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
75e0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
75f0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
7600: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
7610: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
7620: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7630: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7640: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
7650: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
7660: 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69  i>=0 ) p->aCol[i
7670: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  ].notNull = onEr
7680: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
7690: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
76a0: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
76b0: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
76c0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
76d0: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
76e0: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
76f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
7700: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
7710: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
7720: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
7730: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7740: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
7750: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
7760: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
7770: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
7780: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
7790: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
77a0: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
77b0: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
77c0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
77d0: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
77e0: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
77f0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
7800: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
7810: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
7820: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
7830: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
7840: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
7850: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
7860: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
7870: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
78a0: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
78b0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
78c0: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
78d0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
78e0: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
78f0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7900: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
7910: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7920: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
7930: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7940: 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52  E_AFF_NONE.** 'R
7950: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
7960: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7970: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
7980: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7990: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
79a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
79b0: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
79c0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
79d0: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
79e0: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
79f0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
7a00: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
7a10: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
7a20: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
7a30: 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54  (const Token *pT
7a40: 79 70 65 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  ype){.  u32 h = 
7a50: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
7a60: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7a70: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  IC;.  const unsi
7a80: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d  gned char *zIn =
7a90: 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20 63 6f 6e   pType->z;.  con
7aa0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7ab0: 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79 70 65 2d   *zEnd = &pType-
7ac0: 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b 0a 0a 20  >z[pType->n];.. 
7ad0: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 45 6e   while( zIn!=zEn
7ae0: 64 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  d ){.    h = (h<
7af0: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
7b00: 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49 6e 5d 3b  erToLower[*zIn];
7b10: 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20  .    zIn++;.    
7b20: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
7b30: 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27  )+('h'<<16)+('a'
7b40: 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20  <<8)+'r') ){    
7b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52           /* CHAR
7b60: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7b70: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7b80: 20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20   .    }else if( 
7b90: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
7ba0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
7bb0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
7bc0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
7bd0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7be0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
7bf0: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
7c00: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
7c10: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
7c20: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
7c30: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7c40: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
7c50: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7c60: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
7c70: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
7c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
7c90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
7ca0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7cb0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
7cc0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
7cd0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
7ce0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
7cf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d00: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
7d10: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
7d20: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
7d30: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
7d40: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
7d50: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
7d60: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
7d70: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
7d80: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
7d90: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
7da0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7db0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
7dc0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
7dd0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
7de0: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
7df0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7e00: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7e10: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7e20: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
7e30: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
7e40: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
7e50: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
7e60: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
7e70: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
7e80: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
7e90: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
7ea0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
7eb0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
7ec0: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
7ed0: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
7ee0: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
7ef0: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
7f00: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
7f10: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7f20: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
7f30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
7f40: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
7f50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7f60: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
7f70: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
7f80: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
7f90: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
7fa0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7fb0: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
7fc0: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
7fd0: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
7fe0: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
7ff0: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
8000: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
8010: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
8020: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8030: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
8040: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
8050: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
8060: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
8070: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
8080: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
8090: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
80a0: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
80b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
80c0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
80d0: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
80e0: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
80f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
8100: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8110: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
8120: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
8130: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
8140: 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  Col;..  if( (p =
8150: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8160: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
8170: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
8180: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
8190: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
81a0: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 73 71  p->aCol[i];.  sq
81b0: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
81c0: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  Type);.  pCol->z
81d0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
81e0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 79 70  meFromToken(pTyp
81f0: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
8200: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8210: 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70 65  finityType(pType
8220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8230: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
8240: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
8250: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
8260: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
8270: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
8280: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8290: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
82a0: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
82b0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
82c0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
82d0: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
82e0: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
82f0: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8300: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8310: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8320: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8330: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8340: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8350: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8360: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
8370: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
8380: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8390: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
83a0: 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  xpr){.  Table *p
83b0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
83c0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
83d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 21  rse->pNewTable)!
83e0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
83f0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8400: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8410: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8420: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
8430: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
8440: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8450: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
8460: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
8470: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
8480: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
8490: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
84a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
84b0: 20 20 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a 20    Expr *pCopy;. 
84c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
84d0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
84e0: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
84f0: 3e 70 44 66 6c 74 20 3d 20 70 43 6f 70 79 20 3d  >pDflt = pCopy =
8500: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8510: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
8520: 28 20 70 43 6f 70 79 20 29 7b 0a 20 20 20 20 20  ( pCopy ){.     
8530: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
8540: 6f 70 79 28 26 70 43 6f 70 79 2d 3e 73 70 61 6e  opy(&pCopy->span
8550: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
8560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8570: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
8580: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 7d  Delete(pExpr);.}
8590: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
85a0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
85b0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
85c0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
85d0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
85e0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
85f0: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
8600: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
8610: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
8620: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
8630: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
8640: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
8650: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
8660: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
8670: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
8680: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
8690: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
86a0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
86b0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
86c0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
86d0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
86e0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
86f0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
8700: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
8710: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
8720: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
8730: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
8740: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
8750: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
8760: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
8770: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
8780: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
8790: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
87a0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
87b0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
87c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
87d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
87e0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
87f0: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
8800: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
8810: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
8820: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
8830: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
8840: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
8850: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
8860: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
8870: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
8880: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
8890: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
88a0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
88b0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
88c0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
88d0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
88e0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
88f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8900: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8910: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
8920: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
8930: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
8940: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
8950: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
8960: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
8970: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
8980: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
8990: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
89a0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
89b0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
89c0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
89d0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
89e0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
89f0: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
8a00: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
8a10: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8a20: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
8a30: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
8a40: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
8a50: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
8a60: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
8a70: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
8a80: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68  t;.  if( pTab->h
8a90: 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20  asPrimKey ){.   
8aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8ab0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8ac0: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
8ad0: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
8ae0: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
8af0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
8b00: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
8b10: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
8b20: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20  b->hasPrimKey = 
8b30: 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  1;.  if( pList==
8b40: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
8b50: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
8b60: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
8b70: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
8b80: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
8b90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
8ba0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8bb0: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
8bc0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
8bd0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
8be0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
8bf0: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
8c00: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
8c10: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
8c20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
8c40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8c50: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
8c60: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
8c70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8c80: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
8c90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8ca0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
8cb0: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
8cc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
8cd0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
8ce0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
8cf0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
8d00: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
8d10: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
8d20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8d30: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
8d40: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
8d50: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
8d60: 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20  E_SO_ASC ){.    
8d70: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
8d80: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
8d90: 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b  yConf = onError;
8da0: 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49  .    pTab->autoI
8db0: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20  nc = autoInc;.  
8dc0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
8dd0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
8de0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
8df0: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
8e00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8e10: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
8e20: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
8e30: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
8e40: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
8e50: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
8e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8e70: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
8e80: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
8e90: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
8ea0: 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72   0, 0, sortOrder
8eb0: 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  , 0);.    pList 
8ec0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
8ed0: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
8ee0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8ef0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
8f00: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
8f10: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
8f20: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
8f30: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8f40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8f50: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8f60: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
8f70: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
8f80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
8f90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8fa0: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
8fb0: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
8fc0: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
8fd0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
8fe0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
8ff0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
9000: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9010: 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21  .  if( pTab && !
9020: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
9030: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43 48  ){.    /* The CH
9040: 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  ECK expression m
9050: 75 73 74 20 62 65 20 64 75 70 6c 69 63 61 74 65  ust be duplicate
9060: 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e 73  d so that tokens
9070: 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74 6f   refer.    ** to
9080: 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   malloced space 
9090: 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70 68  and not the (eph
90a0: 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66 20  emeral) text of 
90b0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
90c0: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
90d0: 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e 70  t */.    pTab->p
90e0: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
90f0: 78 70 72 41 6e 64 28 70 54 61 62 2d 3e 70 43 68  xprAnd(pTab->pCh
9100: 65 63 6b 2c 20 73 71 6c 69 74 65 33 45 78 70 72  eck, sqlite3Expr
9110: 44 75 70 28 70 43 68 65 63 6b 45 78 70 72 29 29  Dup(pCheckExpr))
9120: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
9130: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9140: 28 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a  (pCheckExpr);.}.
9150: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
9160: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
9170: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
9180: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
9190: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
91a0: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
91b0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
91c0: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
91d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
91e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
91f0: 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a  pe, int nType){.
9200: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
9210: 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  t i;..  if( (p =
9220: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9230: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
9240: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
9250: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
9260: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
9270: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79  arse, zType, nTy
9280: 70 65 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  pe) ){.    Index
9290: 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61   *pIdx;.    p->a
92a0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 73  Col[i].zColl = s
92b0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 54 79  qliteStrNDup(zTy
92c0: 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 0a 20  pe, nType);.  . 
92d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
92e0: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
92f0: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
9300: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
9310: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
9320: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
9330: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
9340: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
9350: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
9360: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
9370: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
9380: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
9390: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
93a0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
93b0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
93c0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
93d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
93e0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
93f0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
9400: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9410: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
9420: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
9430: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
9440: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
9450: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9460: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9470: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9480: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9490: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
94a0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
94b0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
94c0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
94d0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
94e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
94f0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9500: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9510: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9520: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9530: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9540: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9550: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9560: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
9570: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
9580: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9590: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
95a0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
95b0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
95c0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
95d0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
95e0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
95f0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9600: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9610: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9620: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9630: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9640: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9650: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9660: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9670: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9680: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9690: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
96a0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
96b0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
96c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
96d0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
96e0: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
96f0: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
9700: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
9710: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9720: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9730: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9740: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9750: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
9760: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9770: 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  age..*/.CollSeq 
9780: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
9790: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
97a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
97b0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
97c0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
97d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
97e0: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
97f0: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
9800: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
9810: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
9820: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
9830: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9840: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
9850: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
9860: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
9870: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
9880: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
9890: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
98a0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
98b0: 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61  q(db, pColl, zNa
98c0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
98d0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
98e0: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20      if( nName<0 
98f0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65  ){.        nName
9900: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
9910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9920: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9930: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
9940: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9950: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
9960: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
9970: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   pColl = 0;.    
9980: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9990: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
99a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
99b0: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
99c0: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
99d0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
99e0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
99f0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9a00: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
9a10: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
9a20: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
9a30: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
9a40: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
9a50: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
9a60: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
9a70: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
9a80: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
9a90: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
9aa0: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
9ab0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
9ac0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
9ad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
9ae0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
9af0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
9b00: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
9b10: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
9b20: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
9b30: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
9b40: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
9b50: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
9b60: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
9b70: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
9b80: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
9b90: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
9ba0: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
9bb0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
9bc0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
9bd0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
9be0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
9bf0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
9c00: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
9c10: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
9c20: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
9c30: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
9c40: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
9c50: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
9c60: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
9c70: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
9c80: 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  okie(sqlite3 *db
9c90: 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  , Vdbe *v, int i
9ca0: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db){.  sqlite3Vd
9cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9cc0: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
9cd0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
9ce0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29  ema_cookie+1, 0)
9cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9d00: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
9d10: 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d  okie, iDb, 0);.}
9d20: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
9d30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
9d40: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
9d50: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
9d60: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
9d70: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
9d80: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
9d90: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
9da0: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
9db0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
9dc0: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a  l terminator..**
9dd0: 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
9de0: 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65   is conservative
9df0: 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c  .  It might be l
9e00: 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20  arger that what 
9e10: 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65  is.** really nee
9e20: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
9e30: 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63  nt identLength(c
9e40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9e50: 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d   int n;.  for(n=
9e60: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
9e70: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22  {.    if( *z=='"
9e80: 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a  ' ){ n++; }.  }.
9e90: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a    return n + 2;.
9ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
9eb0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74  n identifier ont
9ec0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
9ed0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
9ee0: 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61  Add.** quote cha
9ef0: 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64 65  racters as neede
9f00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9f10: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
9f20: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
9f30: 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e  har *zSignedIden
9f40: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
9f50: 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75  har *zIdent = (u
9f60: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
9f70: 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e  ignedIdent;.  in
9f80: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
9f90: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
9fa0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
9fb0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
9fc0: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
9fd0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
9fe0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
9ff0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
a000: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
a010: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
a020: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
a030: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
a040: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
a050: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
a060: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
a070: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
a080: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
a090: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
a0a0: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
a0b0: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
a0c0: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
a0d0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a0e0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
a0f0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
a100: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
a110: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
a120: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
a130: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a140: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
a150: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
a160: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
a170: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
a180: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
a190: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
a1a0: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
a1b0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
a1c0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
a1d0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
a1e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
a1f0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
a200: 6d 74 28 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74  mt(Table *p, int
a210: 20 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20   isTemp){.  int 
a220: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
a230: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
a240: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
a250: 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  End, *z;.  Colum
a260: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
a270: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
a280: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a290: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a2a0: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
a2b0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
a2c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  >zName);.    z =
a2d0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
a2e0: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20    if( z ){.     
a2f0: 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29   n += (strlen(z)
a300: 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   + 1);.    }.  }
a310: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
a320: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
a330: 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20   if( n<50 ){.   
a340: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
a350: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
a360: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
a370: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
a380: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
a390: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
a3a0: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
a3b0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
a3c0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
a3d0: 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
a3e0: 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28  cRaw( n );.  if(
a3f0: 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75   zStmt==0 ) retu
a400: 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rn 0;.  sqlite3_
a410: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
a420: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
a430: 20 20 20 20 20 21 4f 4d 49 54 5f 54 45 4d 50 44       !OMIT_TEMPD
a440: 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52 45  B&&isTemp ? "CRE
a450: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
a460: 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22  :"CREATE TABLE "
a470: 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28  );.  k = strlen(
a480: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
a490: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
a4a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
a4b0: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
a4c0: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
a4d0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
a4e0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
a4f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a500: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
a510: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
a520: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
a530: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
a540: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
a550: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
a560: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
a570: 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c     if( (z = pCol
a580: 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  ->zType)!=0 ){. 
a590: 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20       zStmt[k++] 
a5a0: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61 73 73  = ' ';.      ass
a5b0: 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 29 2b 6b  ert( strlen(z)+k
a5c0: 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20 73  +1<=n );.      s
a5d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a5e0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
a5f0: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
a600: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a  k += strlen(z);.
a610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
a620: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
a630: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
a640: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
a650: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
a660: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a670: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
a680: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
a690: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
a6a0: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
a6b0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
a6c0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
a6d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
a6e0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
a6f0: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
a700: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
a710: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
a720: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
a730: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
a740: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
a750: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
a760: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
a770: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
a780: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
a790: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
a7a0: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
a7b0: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
a7c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
a7d0: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
a7e0: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
a7f0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
a800: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
a810: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
a820: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
a830: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
a840: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
a850: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
a860: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
a870: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
a880: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
a890: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
a8a0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
a8b0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
a8c0: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
a8d0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
a8e0: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
a8f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
a900: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
a910: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
a920: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
a930: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
a940: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
a950: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
a960: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
a970: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
a980: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
a990: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
a9a0: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
a9b0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
a9c0: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
a9d0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
a9e0: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
a9f0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
aa00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
aa10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
aa20: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
aa30: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
aa40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
aa50: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
aa60: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
aa70: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
aa80: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
aa90: 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27    /* The final '
aaa0: 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  )' token in the 
aab0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
aac0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
aad0: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
aae0: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
aaf0: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
ab00: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
ab10: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
ab20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ab30: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
ab40: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
ab50: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
ab60: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
ab70: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
ab80: 28 29 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  () ) {.    retur
ab90: 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61  n;.  }.  p = pPa
aba0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
abb0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
abc0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
abd0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
abe0: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
abf0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
ac00: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
ac10: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
ac20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ac30: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
ac40: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
ac50: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
ac60: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
ac70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
ac80: 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c  heck ){.    SrcL
ac90: 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20  ist sSrc;       
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
acb0: 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20  ake SrcList for 
acc0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
acd0: 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  e */.    NameCon
ace0: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
acf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ad00: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
ad10: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
ad20: 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  /..    memset(&s
ad30: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
ad40: 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  C));.    memset(
ad50: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
ad60: 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72  (sSrc));.    sSr
ad70: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  c.nSrc = 1;.    
ad80: 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  sSrc.a[0].zName 
ad90: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  = p->zName;.    
ada0: 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d  sSrc.a[0].pTab =
adb0: 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   p;.    sSrc.a[0
adc0: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
add0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
ade0: 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
adf0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
ae00: 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65  c;.    sNC.isChe
ae10: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ck = 1;.    if( 
ae20: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
ae30: 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
ae40: 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20  >pCheck) ){.    
ae50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ae60: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
ae70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ae80: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
ae90: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
aea0: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
aeb0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
aec0: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
aed0: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
aee0: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
aef0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
af00: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
af10: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
af20: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
af30: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
af40: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
af50: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
af60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
af70: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
af80: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
af90: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
afa0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
afb0: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
afc0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
afd0: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
afe0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
aff0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
b000: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
b010: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
b020: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
b030: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
b040: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
b050: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
b060: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
b070: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
b080: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
b090: 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  .  The record nu
b0a0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
b0b0: 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72  e new table entr
b0c0: 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  y should already
b0d0: 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b   be on the stack
b0e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
b0f0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
b100: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
b110: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
b120: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
b130: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
b140: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
b150: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
b160: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
b170: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
b180: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
b190: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
b1a0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
b1b0: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
b1c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
b1d0: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
b1e0: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
b1f0: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
b200: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
b210: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
b220: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
b230: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
b240: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b250: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
b260: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b270: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b280: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b290: 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  e, 0, 0);..    /
b2a0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
b2b0: 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65  tpage for the ne
b2c0: 77 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68  w table and push
b2d0: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61   it onto the sta
b2e0: 63 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65  ck..    ** A vie
b2f0: 77 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67  w has no rootpag
b300: 65 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20  e, so just push 
b310: 61 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20  a zero onto the 
b320: 73 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a  stack for.    **
b330: 20 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c   views.  Initial
b340: 69 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65  ize zType at the
b350: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
b360: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
b370: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
b380: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
b390: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
b3a0: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
b3b0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
b3c0: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
b3d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
b3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b3f0: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
b400: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
b410: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
b420: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
b430: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
b440: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
b450: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
b460: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
b470: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
b480: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
b490: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
b4a0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
b4b0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
b4c0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
b4d0: 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74  ew table is on t
b4e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64  he top of the vd
b4f0: 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  be stack..    **
b500: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
b510: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
b520: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
b530: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
b540: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
b550: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
b560: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
b570: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
b580: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
b590: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
b5a0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
b5b0: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
b5c0: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
b5d0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
b5e0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
b5f0: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
b600: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
b610: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
b620: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
b630: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
b640: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
b650: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
b660: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
b670: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
b680: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
b690: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
b6a0: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
b6b0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
b6c0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
b6d0: 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73  pSelTab;.      s
b6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b6f0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
b700: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b720: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
b730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b740: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
b750: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
b760: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
b770: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
b780: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
b790: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54  se, pSelect, SRT
b7a0: 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c  _Table, 1, 0, 0,
b7b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
b7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b7d0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
b7e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
b7f0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
b800: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20          pSelTab 
b810: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
b820: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
b830: 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e, 0, pSelect);.
b840: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
b850: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
b860: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b870: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
b880: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
b890: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
b8a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
b8b0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
b8c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
b8d0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
b8e0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
b8f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
b900: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
b910: 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  e(pSelTab);.    
b920: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
b930: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
b940: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
b950: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
b960: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
b970: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
b980: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
b990: 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53  bleStmt(p, p->pS
b9a0: 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64  chema==pParse->d
b9b0: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
b9c0: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
b9d0: 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a       n = pEnd->z
b9e0: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
b9f0: 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20  Token.z + 1;.   
ba00: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
ba10: 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54  e3MPrintf("CREAT
ba20: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
ba30: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
ba40: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
ba50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
ba60: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
ba70: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
ba80: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
ba90: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
baa0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
bab0: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
bac0: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
bad0: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
bae0: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
baf0: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
bb00: 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66  ed.  The rowid f
bb10: 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61  or the prealloca
bb20: 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  ted.    ** slot 
bb30: 69 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20  is the 2nd item 
bb40: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
bb50: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
bb60: 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ack is the.    *
bb70: 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  * root page for 
bb80: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f  the new table (o
bb90: 72 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73  r a 0 if this is
bba0: 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f   a view)..    */
bbb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
bbc0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
bbd0: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
bbe0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
bbf0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
bc00: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
bc10: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30  =%Q, rootpage=#0
bc20: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
bc30: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
bc40: 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  1",.      db->aD
bc50: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
bc60: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
bc70: 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
bc80: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
bc90: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
bca0: 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
bcb0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bcc0: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
bcd0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
bce0: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69  db, v, iDb);..#i
bcf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bd00: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
bd10: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
bd20: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
bd30: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
bd40: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
bd50: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
bd60: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
bd70: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
bd80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bd90: 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20   p->autoInc ){. 
bda0: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
bdb0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
bdc0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
bdd0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
bde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
bdf0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
be00: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
be10: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
be20: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
be30: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
be40: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
be50: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
be60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
be70: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
be80: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
be90: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
bea0: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
beb0: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
bec0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
bed0: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
bee0: 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  b, 0,.        sq
bef0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62  lite3MPrintf("tb
bf00: 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e  l_name='%q'",p->
bf10: 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
bf20: 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  IC);.  }...  /* 
bf30: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
bf40: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
bf50: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
bf60: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
bf70: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bf80: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
bf90: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
bfa0: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
bfb0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20     FKey *pFKey; 
bfc0: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
bfd0: 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
bfe0: 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  a;.    pOld = sq
bff0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
c000: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
c010: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  h, p->zName, str
c020: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
c030: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
c040: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c050: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
c060: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
c070: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
c080: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
c090: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c0a0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
c0b0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
c0c0: 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65  KEY.    for(pFKe
c0d0: 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  y=p->pFKey; pFKe
c0e0: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
c0f0: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
c100: 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c    int nTo = strl
c110: 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b  en(pFKey->zTo) +
c120: 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d   1;.      pFKey-
c130: 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74  >pNextTo = sqlit
c140: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
c150: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  ema->aFKey, pFKe
c160: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
c170: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
c180: 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
c190: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
c1a0: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
c1b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
c1c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
c1d0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
c1e0: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
c1f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
c200: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
c210: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c220: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
c230: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
c240: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
c250: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
c260: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
c270: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
c280: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  en.z;.      int 
c290: 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73  nName;.      ass
c2a0: 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26  ert( !pSelect &&
c2b0: 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29   pCons && pEnd )
c2c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
c2d0: 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s->z==0 ){.     
c2e0: 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b     pCons = pEnd;
c2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c300: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
c310: 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
c320: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e  zName;.      p->
c330: 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
c340: 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
c350: 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
c360: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
c370: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
c380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c390: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
c3a0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
c3b0: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
c3c0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
c3d0: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
c3e0: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
c3f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c400: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
c410: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c420: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
c430: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
c440: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
c450: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
c460: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
c470: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
c480: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
c490: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c4a0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
c4b0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
c4c0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
c4d0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
c4e0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
c4f0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
c500: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
c510: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
c520: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
c530: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
c540: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
c550: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
c560: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
c570: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
c580: 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
c590: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
c5a0: 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
c5b0: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
c5c0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
c5d0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
c5e0: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  ed char *z;.  To
c5f0: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
c600: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
c610: 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  n *pName;.  int 
c620: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
c630: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
c640: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c650: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
c660: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
c670: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
c680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
c690: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c6a0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c6b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
c6c0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
c6d0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
c6e0: 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
c6f0: 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
c700: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
c710: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
c720: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
c730: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
c740: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
c750: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
c760: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
c770: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
c780: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
c790: 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
c7a0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
c7b0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  x(pParse->db, p-
c7c0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28  >pSchema);.  if(
c7d0: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
c7e0: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
c7f0: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
c800: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
c810: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
c820: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
c830: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c840: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
c850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c860: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
c870: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
c880: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c890: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
c8a0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
c8b0: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
c8c0: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
c8d0: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
c8e0: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
c8f0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
c900: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
c910: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
c920: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
c930: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
c940: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
c950: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
c960: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
c970: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
c980: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
c990: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
c9a0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
c9b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
c9c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
c9d0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
c9e0: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74  led() ){.    ret
c9f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
ca00: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
ca10: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
ca20: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
ca30: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
ca40: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
ca50: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
ca60: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
ca70: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
ca80: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
ca90: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
caa0: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
cab0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
cac0: 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  if( sEnd.z[0]!=0
cad0: 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
cae0: 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
caf0: 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
cb00: 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
cb10: 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65  n = sEnd.z - pBe
cb20: 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63  gin->z;.  z = (c
cb30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
cb40: 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  ar*)pBegin->z;. 
cb50: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28   while( n>0 && (
cb60: 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  z[n-1]==';' || i
cb70: 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20  sspace(z[n-1])) 
cb80: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
cb90: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
cba0: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
cbb0: 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
cbc0: 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
cbd0: 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
cbe0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
cbf0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
cc00: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
cc10: 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  0, &sEnd, 0);.  
cc20: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
cc30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cc40: 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
cc50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cc60: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
cc70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cc80: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
cc90: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
cca0: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
ccb0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
ccc0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
ccd0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
cce0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
ccf0: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
cd00: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
cd10: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
cd20: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
cd30: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
cd40: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
cd50: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
cd60: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
cd70: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
cd80: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
cd90: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
cda0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
cdb0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
cdc0: 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
cdd0: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
cde0: 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
cdf0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
ce00: 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
ce10: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
ce20: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
ce30: 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
ce40: 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
ce50: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
ce60: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
ce70: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
ce80: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
ce90: 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
cea0: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
ceb0: 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61  assigned */..  a
cec0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
ced0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cee0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
cef0: 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
cf00: 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
cf10: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
cf20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
cf30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
cf40: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
cf50: 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
cf60: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
cf70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cf80: 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
cf90: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
cfa0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
cfb0: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
cfc0: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
cfd0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
cfe0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
cff0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
d000: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
d010: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
d020: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
d030: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
d040: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
d050: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
d060: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
d070: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
d080: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
d090: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
d0a0: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
d0b0: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
d0c0: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
d0d0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
d0e0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
d0f0: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
d100: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
d110: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
d120: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
d130: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
d140: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
d150: 69 73 20 65 72 72 6f 72 20 69 73 20 63 61 75 67  is error is caug
d160: 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e  ht previously an
d170: 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d so the followi
d180: 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f  ng test.  ** sho
d190: 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  uld always fail.
d1a0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65    But we will le
d1b0: 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20  ave it in place 
d1c0: 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
d1d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
d1e0: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
d1f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d200: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
d210: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
d220: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
d230: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
d240: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
d250: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
d260: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
d270: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
d280: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
d290: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
d2a0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
d2b0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
d2c0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
d2d0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
d2e0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
d2f0: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
d300: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
d310: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
d320: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
d330: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
d340: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
d350: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
d360: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
d370: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
d380: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
d390: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
d3a0: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
d3b0: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
d3c0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
d3d0: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
d3e0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
d3f0: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
d400: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d410: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
d420: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
d430: 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d 3e 70  ectDup(pTable->p
d440: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 70  Select);.  if( p
d450: 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  Sel ){.    n = p
d460: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
d470: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
d480: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
d490: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
d4a0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
d4b0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65  ol = -1;.    pSe
d4c0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
d4d0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
d4e0: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 29  pParse, 0, pSel)
d4f0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
d500: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
d510: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
d520: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
d530: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
d540: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
d550: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
d560: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
d570: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
d580: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
d590: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
d5a0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
d5b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
d5c0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
d5d0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70  SelTab);.      p
d5e0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
d5f0: 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  flags |= DB_Unre
d600: 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65  setViews;.    }e
d610: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
d620: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
d630: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
d640: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d650: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a  ctDelete(pSel);.
d660: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
d670: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69  Err++;.  }.#endi
d680: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d690: 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
d6a0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
d6b0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
d6c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
d6d0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
d6e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d6f0: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
d700: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d710: 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
d720: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
d730: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
d740: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
d750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d760: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
d770: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
d780: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
d790: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
d7a0: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
d7b0: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
d7c0: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
d7d0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
d7e0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
d7f0: 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
d800: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
d810: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
d820: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
d830: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
d840: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
d850: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
d860: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
d870: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
d880: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
d890: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
d8a0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
d8b0: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
d8c0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
d8d0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
d8e0: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
d8f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d900: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
d910: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d920: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
d930: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
d940: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
d950: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
d960: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
d970: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
d980: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
d990: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
d9a0: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
d9b0: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
d9c0: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
d9d0: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
d9e0: 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
d9f0: 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
da00: 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
da10: 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
da20: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
da30: 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
da40: 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
da50: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
da60: 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
da70: 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
da80: 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
da90: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
daa0: 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
dab0: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
dac0: 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
dad0: 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
dae0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
daf0: 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
db00: 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
db10: 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
db20: 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
db30: 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
db40: 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
db50: 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
db60: 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
db70: 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
db80: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
db90: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
dba0: 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
dbb0: 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
dbc0: 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
dbd0: 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
dbe0: 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
dbf0: 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
dc00: 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
dc10: 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
dc20: 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
dc30: 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
dc40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
dc50: 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
dc60: 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
dc70: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
dc80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
dc90: 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
dca0: 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44  3RootPageMoved(D
dcb0: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f  b *pDb, int iFro
dcc0: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
dcd0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
dce0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
dcf0: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
dd00: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
dd10: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
dd20: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
dd30: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
dd40: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
dd50: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
dd60: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
dd70: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
dd80: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
dd90: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
dda0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
ddb0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
ddc0: 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
ddd0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
dde0: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
ddf0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
de00: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
de10: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
de20: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
de30: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
de40: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
de50: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
de60: 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
de70: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
de80: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
de90: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
dea0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
deb0: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
dec0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
ded0: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
dee0: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
def0: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
df00: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
df10: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
df20: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
df30: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
df40: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
df50: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
df60: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
df70: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
df80: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
df90: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
dfa0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
dfb0: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
dfc0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
dfd0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
dfe0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
dff0: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
e000: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
e010: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e020: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
e030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e040: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
e050: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
e060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e070: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
e080: 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20  stroy pushes an 
e090: 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65  integer onto the
e0a0: 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20   stack. If this 
e0b0: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
e0c0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
e0d0: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
e0e0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
e0f0: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
e100: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
e110: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
e120: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
e130: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e140: 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
e150: 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
e160: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22  **.  ** The "#0"
e170: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
e180: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
e190: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
e1a0: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
e1b0: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
e1c0: 66 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65  f the stack.  Se
e1d0: 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65  e sqlite3Registe
e1e0: 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  rExpr()..  */.  
e1f0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
e200: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
e210: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
e220: 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
e230: 48 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74  HERE #0 AND root
e240: 70 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70  page=#0",.     p
e250: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
e260: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
e270: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
e280: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  able);.#endif.}.
e290: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
e2a0: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
e2b0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
e2c0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
e2d0: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
e2e0: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
e2f0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e300: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
e310: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
e320: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
e330: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
e340: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
e350: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
e360: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
e370: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
e380: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
e390: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
e3a0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
e3b0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
e3c0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
e3d0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
e3e0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
e3f0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e400: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
e410: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
e420: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
e430: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
e440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
e450: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
e460: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
e470: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
e480: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
e490: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
e4a0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
e4b0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
e4c0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
e4d0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
e4e0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
e4f0: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
e500: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
e510: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
e520: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
e530: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
e540: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
e550: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
e560: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
e570: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
e580: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
e590: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
e5a0: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
e5b0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
e5c0: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
e5d0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
e5e0: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
e5f0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
e600: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
e610: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
e620: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
e630: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
e640: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
e650: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
e660: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
e670: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
e680: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
e690: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
e6a0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
e6b0: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
e6c0: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
e6d0: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
e6e0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
e6f0: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
e700: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
e710: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
e720: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
e730: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
e740: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
e750: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
e760: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
e770: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
e780: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
e790: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
e7a0: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
e7b0: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
e7c0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
e7d0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
e7e0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
e7f0: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
e800: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
e810: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
e820: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
e830: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
e840: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
e850: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
e860: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e870: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e880: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
e890: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
e8a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e8b0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
e8c0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
e8d0: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
e8e0: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
e8f0: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
e900: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
e910: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
e920: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
e930: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e940: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
e950: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
e960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
e970: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
e980: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
e990: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
e9a0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
e9b0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
e9c0: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
e9d0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
e9e0: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
e9f0: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
ea00: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
ea10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ea20: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
ea30: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
ea40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
ea50: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
ea60: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
ea70: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
ea80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ea90: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
eaa0: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
eab0: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
eac0: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
ead0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
eae0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
eaf0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb00: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
eb10: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
eb20: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
eb30: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
eb40: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
eb50: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
eb60: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
eb70: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
eb80: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
eb90: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
eba0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
ebb0: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
ebc0: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
ebd0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
ebe0: 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20   if( noErr ){.  
ebf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ec00: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
ec10: 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78     }.    goto ex
ec20: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
ec30: 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
ec40: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ec50: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
ec60: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
ec70: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
ec80: 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  nDb );.#ifndef S
ec90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
eca0: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
ecb0: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
ecc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
ecd0: 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
ece0: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
ecf0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
ed00: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
ed10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ed20: 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
ed30: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
ed40: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
ed50: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
ed60: 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
ed70: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
ed80: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
ed90: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
eda0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
edb0: 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
edc0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
edd0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
ede0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
edf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
ee00: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
ee10: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
ee20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ee30: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ee40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
ee50: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
ee60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ee70: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
ee80: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
ee90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
eea0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
eeb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
eec0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
eed0: 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
eee0: 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e    zArg2 = pTab->
eef0: 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
ef00: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
ef10: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
ef20: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
ef30: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
ef40: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
ef50: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
ef60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
ef70: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ef80: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
ef90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
efa0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
efb0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
efc0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
efd0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
efe0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
eff0: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
f000: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
f010: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
f020: 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
f030: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
f040: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
f050: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f060: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f070: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
f080: 64 4f 6e 6c 79 20 7c 7c 20 70 54 61 62 3d 3d 64  dOnly || pTab==d
f090: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
f0a0: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 29 7b 0a  ema->pSeqTab ){.
f0b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f0c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
f0d0: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
f0e0: 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
f0f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
f100: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
f110: 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
f120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f130: 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
f140: 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
f150: 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
f160: 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
f170: 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
f180: 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
f190: 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
f1a0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
f1b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f1c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f1d0: 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
f1e0: 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
f1f0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
f200: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
f210: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
f220: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
f230: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
f240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f250: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
f260: 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
f270: 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
f280: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
f290: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f2a0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
f2b0: 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
f2c0: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
f2d0: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
f2e0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
f2f0: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
f300: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
f310: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f320: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
f330: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
f340: 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62  ger;.    Db *pDb
f350: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
f360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
f370: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
f380: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
f390: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f3a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f3b0: 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69  BLE.    if( IsVi
f3c0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
f3d0: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73       Vdbe *v = s
f3e0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f3f0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
f400: 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71   v ){.        sq
f410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f420: 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20  , OP_VBegin, 0, 
f430: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f440: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
f450: 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
f460: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
f470: 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
f480: 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
f490: 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  .    ** is gener
f4a0: 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
f4b0: 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
f4c0: 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
f4d0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  .    ** sqlite_t
f4e0: 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
f4f0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
f500: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
f510: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
f520: 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
f530: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
f540: 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
f550: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f560: 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
f570: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
f580: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
f590: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
f5a0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
f5b0: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
f5c0: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20  Trigger);.      
f5d0: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
f5e0: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
f5f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f600: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
f610: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
f620: 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
f630: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
f640: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
f650: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
f660: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
f670: 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
f680: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
f690: 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
f6a0: 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74  pped.    ** at t
f6b0: 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
f6c0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
f6d0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
f6e0: 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  e needs to.    *
f6f0: 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
f700: 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
f710: 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
f720: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
f730: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f740: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  pTab->autoInc ){
f750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
f760: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
f770: 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
f780: 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65  E FROM %s.sqlite
f790: 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
f7a0: 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
f7b0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
f7c0: 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
f7d0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
f7e0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
f7f0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
f800: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
f810: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
f820: 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
f830: 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
f840: 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
f850: 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
f860: 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
f870: 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  es.    ** every 
f880: 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
f890: 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
f8a0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
f8b0: 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20  he one being.   
f8c0: 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
f8d0: 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
f8e0: 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
f8f0: 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
f900: 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  an be.    ** cre
f910: 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
f920: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
f930: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
f940: 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20   in another.    
f950: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
f960: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
f970: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f980: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c  e, .        "DEL
f990: 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
f9a0: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
f9b0: 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
f9c0: 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70  ger'",.        p
f9d0: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
f9e0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
f9f0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
fa00: 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
fa10: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
fa20: 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
fa30: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
fa40: 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
fa50: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
fa60: 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
fa70: 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
fa80: 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
fa90: 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  fy.    ** the sc
faa0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20  hema cookie..   
fab0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69   */.    if( IsVi
fac0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
fad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fae0: 4f 70 33 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op3(v, OP_VDestr
faf0: 6f 79 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62  oy, iDb, 0, pTab
fb00: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
fb10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
fb20: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
fb30: 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70  Table, iDb, 0, p
fb40: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
fb50: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
fb60: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
fb70: 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
fb80: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
fb90: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
fba0: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
fbb0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
fbc0: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
fbd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fbe0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
fbf0: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
fc00: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
fc10: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
fc20: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
fc30: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
fc40: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
fc50: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
fc60: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
fc70: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
fc80: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
fc90: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
fca0: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
fcb0: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
fcc0: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
fcd0: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
fce0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
fcf0: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
fd00: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
fd10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
fd20: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
fd30: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
fd40: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
fd50: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
fd60: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
fd70: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
fd80: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
fd90: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
fda0: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
fdb0: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
fdc0: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
fdd0: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
fde0: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
fdf0: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
fe00: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
fe10: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
fe20: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
fe30: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
fe40: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
fe50: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
fe60: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
fe70: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
fe80: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
fe90: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
fea0: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
feb0: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
fec0: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
fed0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
fee0: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
fef0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
ff00: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
ff10: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
ff20: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
ff30: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
ff40: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
ff50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
ff60: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
ff70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ff80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ff90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ffa0: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
ffb0: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
ffc0: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
ffd0: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
ffe0: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
fff0: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
10000 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
10010 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
10020 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
10030 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
10040 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
10050 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
10060 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
10070 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
10080 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
10090 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
100a0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
100b0 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
100c0 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Key = 0;.  Table
100d0 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
100e0 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
100f0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
10100 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
10110 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
10120 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
10130 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
10140 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43 4c  >nErr || IN_DECL
10150 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
10160 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
10170 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
10180 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
10190 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
101a0 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
101b0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
101c0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
101d0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
101e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
101f0 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
10200 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
10210 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
10220 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
10230 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
10240 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
10250 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
10260 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
10270 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10280 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
10290 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
102a0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
102b0 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
102c0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
102d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
102e0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
102f0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
10300 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
10310 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
10320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
10330 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
10340 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
10350 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
10360 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
10370 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
10380 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
10390 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
103a0 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
103b0 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65  nCol*sizeof(pFKe
103c0 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
103d0 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
103e0 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
103f0 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
10400 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10410 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
10420 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
10430 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
10440 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
10450 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
10460 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
10470 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
10480 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
10490 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
104a0 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
104b0 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
104c0 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
104d0 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
104e0 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
104f0 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
10500 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
10510 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
10520 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
10530 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
10540 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
10550 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
10560 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
10570 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
10580 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
10590 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
105a0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
105b0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
105c0 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
105d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
105e0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
105f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
10600 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
10610 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
10620 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
10630 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
10640 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
10650 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
10660 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
10670 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
10680 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
10690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
106a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
106b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
106c0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
106d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
106e0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
106f0 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
10700 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
10710 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
10720 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
10730 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
10740 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
10750 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
10760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10770 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
10780 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10790 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
107a0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
107b0 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
107c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
107d0 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
107e0 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
107f0 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
10800 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
10810 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
10820 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
10830 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
10840 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
10850 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
10860 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
10870 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
10880 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
10890 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
108a0 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
108b0 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
108c0 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
108d0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
108e0 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
108f0 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
10900 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
10910 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
10920 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
10930 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
10940 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
10950 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10960 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10970 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
10980 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
10990 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
109a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
109b0 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
109c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
109d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
109e0 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
109f0 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
10a00 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
10a10 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
10a20 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
10a30 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
10a40 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
10a50 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
10a60 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
10a70 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
10a80 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
10a90 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
10aa0 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
10ab0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
10ac0 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
10ad0 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
10ae0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
10af0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
10b00 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
10b10 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
10b20 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
10b30 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10b40 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10b50 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
10b60 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
10b70 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
10b80 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10b90 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
10ba0 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
10bb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
10bc0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
10bd0 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
10be0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
10bf0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
10c00 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
10c10 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
10c20 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
10c30 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
10c40 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
10c50 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
10c60 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
10c70 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
10c80 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
10c90 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
10ca0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
10cb0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
10cc0 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
10cd0 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
10ce0 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
10cf0 72 65 61 74 65 64 2e 20 20 54 68 65 20 6d 65 6d  reated.  The mem
10d00 6f 72 79 20 63 65 6c 6c 20 73 70 65 63 69 66 69  ory cell specifi
10d10 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
10d20 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
10d30 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
10d40 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
10d50 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
10d60 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10d70 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
10d80 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
10d90 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
10da0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
10db0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
10dc0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
10dd0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
10de0 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
10df0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
10e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
10e10 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
10e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
10e30 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
10e40 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
10e50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
10e60 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
10e70 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
10e80 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
10e90 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
10ea0 61 72 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20  arse->nTab;     
10eb0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
10ec0 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
10ed0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
10ee0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20  pParse->nTab+1; 
10ef0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
10f00 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
10f10 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
10f20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
10f30 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10f40 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
10f50 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
10f80 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
10f90 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10fc0 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
10fd0 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
10fe0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11000 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
11010 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
11020 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11030 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
11040 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
11050 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
11060 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
11070 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
11080 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11090 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
110a0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
110b0 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
110c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
110d0 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
110e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
110f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
11100 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
11110 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
11120 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
11130 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
11140 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
11150 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
11160 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
11170 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
11180 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11190 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
111a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
111b0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
111c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
111d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
111e0 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74  MemLoad, memRoot
111f0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e  Page, 0);.    tn
11200 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  um = 0;.  }else{
11210 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
11220 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71  ex->tnum;.    sq
11230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11240 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
11250 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
11260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11270 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
11280 62 2c 20 30 29 3b 0a 20 20 70 4b 65 79 20 3d 20  b, 0);.  pKey = 
11290 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
112a0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64  nfo(pParse, pInd
112b0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ex);.  sqlite3Vd
112c0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
112d0 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
112e0 6d 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c  m, (char *)pKey,
112f0 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
11300 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  OFF);.  sqlite3O
11310 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
11320 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
11330 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
11340 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
11350 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11360 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
11370 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
11380 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
11390 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a 20  pIndex, iTab);. 
113a0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
113b0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
113c0 0a 20 20 20 20 69 6e 74 20 63 75 72 61 64 64 72  .    int curaddr
113d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
113e0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
113f0 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20 63 75    int addr2 = cu
11400 72 61 64 64 72 2b 34 3b 0a 20 20 20 20 73 71 6c  raddr+4;.    sql
11410 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
11420 28 76 2c 20 63 75 72 61 64 64 72 2d 31 2c 20 61  (v, curaddr-1, a
11430 64 64 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr2);.    sqlit
11440 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11450 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 30  P_Rowid, iTab, 0
11460 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11470 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
11480 64 49 6d 6d 2c 20 31 2c 20 30 29 3b 0a 20 20 20  dImm, 1, 0);.   
11490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
114a0 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  p(v, OP_IsUnique
114b0 2c 20 69 49 64 78 2c 20 61 64 64 72 32 29 3b 0a  , iIdx, addr2);.
114c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
114d0 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p3(v, OP_Halt, S
114e0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
114f0 2c 20 4f 45 5f 41 62 6f 72 74 2c 0a 20 20 20 20  , OE_Abort,.    
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
11520 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
11530 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
11540 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11550 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
11560 7c 7c 20 61 64 64 72 32 3d 3d 73 71 6c 69 74 65  || addr2==sqlite
11570 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11580 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (v) );.  }.  sql
11590 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
115a0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
115b0 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Idx, 0);.  sqlit
115c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
115d0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
115e0 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
115f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11600 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
11610 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11620 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20 30  P_Close, iTab, 0
11630 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11640 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
11650 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a  e, iIdx, 0);.}..
11660 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
11670 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
11680 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
11690 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
116a0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
116b0 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
116c0 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
116d0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
116e0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
116f0 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
11700 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
11710 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
11720 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
11730 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
11740 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
11750 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
11760 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
11770 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
11780 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11790 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
117a0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
117b0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
117c0 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
117d0 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
117e0 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
117f0 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
11800 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
11810 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
11820 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
11830 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
11840 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
11850 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
11860 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
11870 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
11880 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
11890 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
118a0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
118b0 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
118c0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
118d0 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
118e0 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
118f0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
11900 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
11910 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
11920 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
11930 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
11940 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
11950 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
11960 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
11970 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
11980 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
11990 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
119a0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
119b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
119c0 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
119d0 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
119e0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
119f0 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
11a00 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
11a10 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
11a20 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
11a30 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
11a40 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
11a50 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
11a60 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
11a70 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
11a80 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
11a90 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
11aa0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
11ab0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
11ac0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
11ad0 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
11ae0 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
11af0 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
11b00 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
11b10 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
11b20 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
11b30 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
11b40 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
11b50 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
11b60 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20  t ifNotExist    
11b70 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
11b80 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
11b90 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
11ba0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
11bb0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
11bc0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
11bd0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
11be0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
11bf0 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
11c00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
11c10 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
11c20 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
11c30 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
11c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11c50 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
11c60 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
11c70 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
11c80 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20   nullId;        
11c90 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
11ca0 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
11cb0 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
11cc0 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
11cd0 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
11ce0 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
11cf0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
11d00 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
11d10 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
11d20 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
11d30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
11d40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11d50 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
11d60 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
11d70 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
11d80 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
11d90 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
11da0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
11db0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
11dc0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
11dd0 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
11de0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
11df0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11e00 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
11e10 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
11e20 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
11e30 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
11e40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11e50 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
11e60 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
11e70 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
11e80 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  Col;.  int nExtr
11e90 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  a = 0;.  char *z
11ea0 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70 50  Extra;..  if( pP
11eb0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
11ec0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
11ed0 64 28 29 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  d() || IN_DECLAR
11ee0 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f  E_VTAB ){.    go
11ef0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11f00 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
11f10 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
11f20 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
11f30 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
11f40 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
11f50 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
11f60 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
11f70 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
11f80 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
11f90 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
11fa0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
11fb0 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
11fc0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
11fd0 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
11fe0 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
11ff0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
12000 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
12010 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
12020 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
12030 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
12040 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
12050 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
12060 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
12070 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
12080 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
12090 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
120a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
120b0 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
120c0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
120d0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
120e0 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
120f0 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
12100 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
12110 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
12120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
12130 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
12140 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
12150 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
12160 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
12170 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
12180 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
12190 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
121a0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
121b0 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
121c0 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
121d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
121e0 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
121f0 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
12200 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
12210 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20  ame) &&.        
12220 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
12230 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
12240 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
12250 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
12260 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
12270 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
12280 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
12290 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
122a0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
122b0 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
122c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
122d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
122e0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
122f0 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
12300 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
12310 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
12320 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
12330 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
12340 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
12350 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12360 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12370 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
12380 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
12390 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
123a0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
123b0 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
123c0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
123d0 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
123e0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
123f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
12400 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12410 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
12420 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12430 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
12440 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20  Db[iDb];..  if( 
12450 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
12460 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
12470 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12480 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  ;.  if( pTab->re
12490 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
124a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
124b0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
124c0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
124d0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
124e0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
124f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12500 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12510 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
12520 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
12530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12540 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
12550 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
12560 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
12570 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12580 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
12590 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
125a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
125b0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
125c0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
125d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
125e0 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
125f0 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
12600 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
12610 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12620 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
12630 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
12640 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
12650 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
12660 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
12670 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
12680 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
12690 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
126a0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
126b0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
126c0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
126d0 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
126e0 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
126f0 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
12700 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
12710 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
12720 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
12730 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
12740 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
12750 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
12760 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
12770 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
12780 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
12790 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
127a0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
127b0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
127c0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
127d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
127e0 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
127f0 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
12800 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
12810 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
12820 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
12830 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
12840 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
12850 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
12860 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
12870 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
12880 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
12890 65 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  e);.    if( SQLI
128a0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
128b0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
128c0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
128d0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
128e0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
128f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12900 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
12910 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
12920 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
12930 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
12940 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12950 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12960 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
12970 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
12980 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
12990 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
129a0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
129b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
129c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69  e_index;.      i
129d0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
129e0 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
129f0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
12a00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12a10 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
12a20 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
12a30 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
12a40 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
12a50 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12a60 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
12a70 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
12a80 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
12a90 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d  zName, pDb->zNam
12aa0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
12ab0 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
12ac0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12ad0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12ae0 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
12af0 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
12b00 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
12b10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12b20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
12b30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
12b40 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
12b50 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
12b60 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
12b70 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
12b80 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
12b90 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
12ba0 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
12bb0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
12bc0 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a  f(sizeof(zBuf),z
12bd0 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20 20  Buf,"_%d",n);.  
12be0 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20    zName = 0;.   
12bf0 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
12c00 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  g(&zName, "sqlit
12c10 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 70  e_autoindex_", p
12c20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75 66  Tab->zName, zBuf
12c30 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
12c40 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
12c50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12c60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
12c70 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
12c80 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
12c90 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
12ca0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12cb0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
12cc0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
12cd0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
12ce0 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
12cf0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12d00 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
12d10 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
12d20 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
12d30 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
12d40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12d50 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12d60 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
12d70 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
12d80 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
12d90 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
12da0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
12db0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
12dc0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
12dd0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
12de0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
12df0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
12e00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12e10 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
12e20 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
12e30 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
12e40 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
12e50 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
12e60 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
12e70 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
12e80 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
12e90 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
12ea0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12eb0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
12ec0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
12ed0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
12ee0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
12ef0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
12f00 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61  lId.z = (u8*)pTa
12f10 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
12f20 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
12f30 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
12f40 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64  en((char*)nullId
12f50 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
12f60 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12f70 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
12f80 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
12f90 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
12fa0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12fb0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
12fc0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
12fd0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
12fe0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
12ff0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
13000 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
13010 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
13020 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
13030 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
13040 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
13050 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
13060 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
13070 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
13080 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
13090 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
130a0 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
130b0 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
130c0 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e 70   strlen(pExpr->p
130d0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  Coll->zName));. 
130e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
130f0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
13100 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
13110 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
13120 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
13130 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74  ;.  nCol = pList
13140 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
13150 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  x = sqliteMalloc
13160 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ( .      sizeof(
13170 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20 20  Index) +        
13180 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
13190 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
131a0 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e     sizeof(int)*n
131b0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
131c0 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
131d0 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  n   */.      siz
131e0 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31  eof(int)*(nCol+1
131f0 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ) +       /* Ind
13200 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f  ex.aiRowEst   */
13210 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68  .      sizeof(ch
13220 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  ar *)*nCol +    
13230 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
13240 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
13250 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
13260 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
13270 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
13280 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65  r */.      nName
13290 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
132a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
132b0 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20  .zName      */. 
132c0 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20 20       nExtra     
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
132f0 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f  equence names */
13300 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  .  );.  if( sqli
13310 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
13320 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
13330 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
13340 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
13350 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
13360 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
13370 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
13380 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
13390 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
133a0 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
133b0 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
133c0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
133d0 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
133e0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
133f0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
13400 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
13410 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
13420 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
13430 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
13440 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
13450 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
13460 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
13470 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
13480 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
13490 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
134a0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
134b0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
134c0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
134d0 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
134e0 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
134f0 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
13500 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
13510 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
13520 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
13530 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
13540 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
13550 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
13560 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
13570 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
13580 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
13590 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
135a0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
135b0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
135c0 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
135d0 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
135e0 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
135f0 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
13600 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
13610 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
13620 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
13630 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
13640 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
13650 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
13660 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
13670 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
13680 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
13690 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
136a0 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
136b0 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
136c0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
136d0 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
136e0 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
136f0 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
13700 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  em++){.    const
13710 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20   char *zColName 
13720 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61  = pListItem->zNa
13730 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  me;.    Column *
13740 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  pTabCol;.    int
13750 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
13760 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  der;.    char *z
13770 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
13780 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
13790 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
137a0 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a  me */..    for(j
137b0 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  =0, pTabCol=pTab
137c0 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
137d0 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43  nCol; j++, pTabC
137e0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
137f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
13800 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f  zColName, pTabCo
13810 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  l->zName)==0 ) b
13820 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13830 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
13840 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
13850 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13860 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
13870 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
13880 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
13890 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e  ab->zName, zColN
138a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
138b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
138c0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ex;.    }.    /*
138d0 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
138e0 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
138f0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
13900 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
13910 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68  d.    ** more th
13920 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74  an once within t
13930 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20  he same index.  
13940 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69  Only the first i
13950 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a  nstance of.    *
13960 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c  * the column wil
13970 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62  l ever be used b
13980 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
13990 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e    Note that usin
139a0 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d  g the.    ** sam
139b0 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68  e column more th
139c0 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62  an once cannot b
139d0 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  e an error becau
139e0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20  se that would . 
139f0 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b     ** break back
13a00 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
13a10 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74  ity - it needs t
13a20 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a  o be a warning..
13a30 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65      */.    pInde
13a40 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
13a50 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
13a60 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a  tItem->pExpr ){.
13a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
13a80 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
13a90 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a  pColl );.      z
13aa0 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
13ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
13ac0 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a 45  rintf(nExtra, zE
13ad0 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69 73  xtra, "%s", pLis
13ae0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
13af0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
13b00 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74     zExtra += (st
13b10 72 6c 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29  rlen(zColl) + 1)
13b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13b30 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
13b40 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
13b50 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c        if( !zColl
13b60 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
13b70 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
13b80 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l->zName;.      
13b90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13ba0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
13bb0 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
13bc0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13bd0 7a 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  zColl, -1) ){.  
13be0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13bf0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13c00 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
13c10 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
13c20 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
13c30 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
13c40 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
13c50 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
13c60 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
13c70 74 4f 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75  tOrder[i] = requ
13c80 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
13c90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
13ca0 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
13cb0 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
13cc0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
13cd0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
13ce0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
13cf0 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
13d00 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
13d10 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
13d20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
13d30 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
13d40 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
13d50 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
13d60 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
13d70 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
13d80 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
13d90 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
13da0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
13db0 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
13dc0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
13dd0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
13de0 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
13df0 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
13e00 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
13e10 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
13e20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
13e30 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
13e40 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
13e50 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
13e60 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
13e70 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
13e80 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
13e90 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
13ea0 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
13eb0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
13ec0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
13ed0 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
13ee0 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
13ef0 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
13f00 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
13f10 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
13f20 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
13f30 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
13f40 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
13f50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13f60 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
13f70 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
13f80 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
13f90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
13fa0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
13fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
13fc0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
13fd0 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
13fe0 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
13ff0 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
14000 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
14010 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
14020 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
14030 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
14040 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70  nst char *z1 = p
14050 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
14060 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14070 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d  ar *z2 = pIndex-
14080 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20  >azColl[k];.    
14090 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
140a0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
140b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
140c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
140d0 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  if( pIdx->aSortO
140e0 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  rder[k]!=pIndex-
140f0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29  >aSortOrder[k] )
14100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14110 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71  if( z1!=z2 && sq
14120 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
14130 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
14140 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14150 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
14160 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14170 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
14180 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
14190 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
141a0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
141b0 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
141c0 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
141d0 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
141e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
141f0 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
14200 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
14210 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
14220 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
14230 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
14240 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
14250 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
14260 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
14270 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
14280 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
14290 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
142a0 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
142b0 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
142c0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
142d0 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
142e0 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
142f0 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
14300 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
14310 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
14320 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
14330 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
14340 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14350 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
14360 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
14370 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
14380 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
14390 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
143a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
143b0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
143c0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
143d0 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
143e0 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
143f0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
14400 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
14410 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
14420 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
14430 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
14440 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
14450 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
14460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14470 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
14480 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
144a0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
144b0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
144c0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
144d0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
144e0 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
144f0 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
14500 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
14510 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
14520 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
14530 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
14540 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
14550 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
14560 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
14590 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e   strlen(pIndex->
145a0 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
145b0 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
145c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
145d0 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
145e0 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
145f0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
14600 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14610 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14620 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
14630 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
14640 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
14650 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
14660 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
14670 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
14680 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
14690 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
146a0 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
146b0 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
146c0 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
146d0 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
146e0 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
146f0 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
14700 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
14710 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
14720 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
14730 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
14740 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
14750 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
14760 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
14770 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
14780 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
14790 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
147a0 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
147b0 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
147c0 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
147d0 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
147e0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
147f0 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
14800 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
14810 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
14820 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
14830 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
14840 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
14850 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
14860 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
14870 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
14880 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
14890 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
148a0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
148b0 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
148c0 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
148d0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
148e0 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
148f0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
14900 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
14910 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
14920 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
14930 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
14940 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
14950 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
14960 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
14970 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
14980 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  lse if( db->init
14990 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
149a0 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
149b0 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
149c0 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
149d0 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20  >nMem++;..    v 
149e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
149f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
14a00 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
14a10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14a20 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
14a30 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
14a40 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
14a50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
14a60 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
14a70 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
14a80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14a90 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
14aa0 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
14ab0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
14ac0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14ad0 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30  emStore, iMem, 0
14ae0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
14af0 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
14b00 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
14b10 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
14b20 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
14b30 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
14b40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14b50 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
14b60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  {.      /* A nam
14b70 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
14b80 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
14b90 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
14ba0 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
14bb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
14bc0 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58  ("CREATE%s INDEX
14bd0 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
14be0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
14bf0 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
14c00 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d  ",.        pEnd-
14c10 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20  >z - pName->z + 
14c20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
14c30 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
14c40 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
14c50 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
14c60 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
14c70 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
14c80 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
14c90 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
14ca0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
14cb0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
14cc0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
14cd0 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
14ce0 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
14cf0 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
14d00 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
14d10 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
14d20 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
14d30 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
14d40 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
14d50 78 27 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b  x',%Q,%Q,#0,%Q);
14d60 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
14d70 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
14d80 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14d90 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ,.        pIndex
14da0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
14db0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
14dc0 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
14dd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14de0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
14df0 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
14e00 6c 69 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b  liteFree(zStmt);
14e10 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
14e20 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
14e30 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
14e40 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
14e50 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
14e60 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
14e70 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
14e80 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
14e90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
14ea0 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
14eb0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
14ec0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
14ed0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
14ee0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
14ef0 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
14f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14f10 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
14f20 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a  Schema, iDb, 0,.
14f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14f40 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25  MPrintf("name='%
14f50 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  q'", pIndex->zNa
14f60 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
14f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14f80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45  dbeAddOp(v, OP_E
14f90 78 70 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20  xpire, 0, 0);.  
14fa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
14fb0 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
14fc0 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
14fd0 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
14fe0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
14ff0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
15000 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
15010 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
15020 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
15030 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
15040 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
15050 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
15060 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
15070 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
15080 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
15090 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
150a0 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
150b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
150c0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
150d0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
150e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
150f0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
15100 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
15110 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
15120 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
15130 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
15140 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
15150 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
15160 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
15170 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
15180 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
15190 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
151a0 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
151b0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
151c0 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
151d0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
151e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
151f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
15200 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
15210 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
15220 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
15230 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
15240 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
15250 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
15260 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
15270 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
15280 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
15290 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
152a0 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
152b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
152c0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
152d0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
152e0 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  te(pTblName);.  
152f0 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
15300 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
15310 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15320 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ode to make sure
15330 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
15340 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65   number is at le
15350 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a  ast minFormat..*
15360 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64 20  * The generated 
15370 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  code will increa
15380 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  se the file form
15390 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63  at number if nec
153a0 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20  essary..*/.void 
153b0 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69  sqlite3MinimumFi
153c0 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a  leFormat(Parse *
153d0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c  pParse, int iDb,
153e0 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b   int minFormat){
153f0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20  .  Vdbe *v;.  v 
15400 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15410 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15420 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15430 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15440 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
15450 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
15460 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15470 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d  Integer, minForm
15480 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  at, 0);.    sqli
15490 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
154a0 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74 65  OP_Ge, 0, sqlite
154b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
154c0 28 76 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69  (v)+3);.    sqli
154d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
154e0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46  OP_Integer, minF
154f0 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
15500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15510 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
15520 20 69 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   iDb, 1);.  }.}.
15530 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
15540 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
15550 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
15560 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
15570 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
15580 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
15590 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
155a0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
155b0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
155c0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
155d0 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
155e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
155f0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
15600 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
15610 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
15620 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
15630 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
15640 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
15650 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
15660 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
15670 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
15680 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
15690 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
156a0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
156b0 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
156c0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
156d0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
156e0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
156f0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
15700 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
15710 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
15720 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
15730 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
15740 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
15750 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
15760 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
15770 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
15780 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
15790 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
157a0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
157b0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
157c0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
157d0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
157e0 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
157f0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
15800 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
15810 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
15820 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
15830 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
15840 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
15850 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
15860 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
15870 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15880 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
15890 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
158a0 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64  nsigned *a = pId
158b0 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69  x->aiRowEst;.  i
158c0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
158d0 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d  a!=0 );.  a[0] =
158e0 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28   1000000;.  for(
158f0 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i=pIdx->nColumn;
15900 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=5; i--){.   
15910 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20   a[i] = 5;.  }. 
15920 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a   while( i>=1 ){.
15930 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20      a[i] = 11 - 
15940 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a  i;.    i--;.  }.
15950 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
15960 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
15970 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c      a[pIdx->nCol
15980 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  umn] = 1;.  }.}.
15990 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
159a0 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
159b0 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
159c0 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
159d0 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
159e0 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
159f0 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
15a00 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
15a10 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
15a20 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
15a30 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
15a40 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
15a50 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
15a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15a70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
15a80 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
15a90 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
15aa0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
15ab0 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  d() ){.    goto 
15ac0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
15ad0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15ae0 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
15af0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
15b00 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
15b10 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
15b20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15b30 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
15b40 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
15b50 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
15b60 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
15b70 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
15b80 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
15b90 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
15ba0 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
15bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15bc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
15bd0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
15be0 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
15bf0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
15c00 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
15c10 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
15c20 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
15c30 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
15c40 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
15c50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15c60 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
15c70 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
15c80 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
15c90 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
15ca0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
15cb0 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
15cc0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15cd0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
15ce0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
15cf0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
15d00 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
15d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15d20 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
15d30 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
15d40 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
15d50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
15d60 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
15d70 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
15d80 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
15d90 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
15da0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
15db0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
15dc0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
15dd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15de0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
15df0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
15e00 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
15e10 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
15e20 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
15e30 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
15e40 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
15e50 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15e60 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
15e70 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15e80 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
15e90 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
15ea0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
15eb0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
15ec0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
15ed0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
15ee0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
15ef0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
15f00 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
15f10 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
15f20 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
15f30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15f40 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15f50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   ){.    sqlite3N
15f60 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
15f70 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
15f80 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
15f90 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
15fa0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
15fb0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
15fc0 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
15fd0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a    pIndex->zName.
15fe0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
15ff0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
16000 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
16010 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
16020 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
16030 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
16040 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
16050 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
16060 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
16070 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
16080 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
16090 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
160a0 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
160b0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
160c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
160d0 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
160e0 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
160f0 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
16100 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
16110 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
16120 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
16130 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
16140 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
16150 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
16160 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
16170 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
16180 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
16190 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
161a0 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
161b0 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
161c0 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
161d0 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
161e0 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
161f0 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
16200 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
16210 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
16220 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
16230 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
16240 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
16250 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16260 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
16270 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
16280 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
16290 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
162a0 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
162b0 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
162c0 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
162d0 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
162e0 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
162f0 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
16300 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
16310 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 41 72  ate(.  void *pAr
16320 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
16330 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
16340 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
16350 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
16360 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
16370 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
16380 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
16390 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a 65  /.  int initSize
163a0 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73 74  ,     /* Suggest
163b0 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63  ed initial alloc
163c0 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e  ation, in elemen
163d0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ts */.  int *pnE
163e0 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
163f0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
16400 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
16410 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f  */.  int *pnAllo
16420 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  c,     /* Curren
16430 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c  t size of the al
16440 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65  location, in ele
16450 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  ments */.  int *
16460 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
16470 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
16480 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
16490 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
164a0 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74  *z;.  if( *pnEnt
164b0 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29  ry >= *pnAlloc )
164c0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  {.    void *pNew
164d0 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69 7a  ;.    int newSiz
164e0 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  e;.    newSize =
164f0 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20   (*pnAlloc)*2 + 
16500 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e  initSize;.    pN
16510 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
16520 6f 63 28 70 41 72 72 61 79 2c 20 6e 65 77 53 69  oc(pArray, newSi
16530 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  ze*szEntry);.   
16540 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
16550 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
16560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
16570 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
16580 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e 65 77 53   *pnAlloc = newS
16590 69 7a 65 3b 0a 20 20 20 20 70 41 72 72 61 79 20  ize;.    pArray 
165a0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
165b0 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
165c0 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e  .  memset(&z[*pn
165d0 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d  Entry * szEntry]
165e0 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
165f0 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72   *pIdx = *pnEntr
16600 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  y;.  ++*pnEntry;
16610 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
16620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
16630 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
16640 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
16650 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
16660 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
16670 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
16680 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
16690 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
166a0 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
166b0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
166c0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
166d0 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
166e0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
166f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
16700 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
16710 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
16720 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
16730 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
16740 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16750 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
16760 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
16770 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
16780 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
16790 74 65 28 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  te(.      pList-
167a0 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
167b0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
167c0 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70       5,.      &p
167d0 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
167e0 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c   &pList->nAlloc,
167f0 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
16800 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
16810 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
16820 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
16830 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
16840 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
16850 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
16860 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
16870 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
16880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
16890 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
168a0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
168b0 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20  stDelete(IdList 
168c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
168d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
168e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
168f0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
16900 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
16910 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
16920 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
16930 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
16940 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
16950 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
16960 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16970 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
16980 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
16990 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
169a0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
169b0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
169c0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
169d0 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
169e0 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
169f0 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
16a00 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16a10 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
16a20 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
16a30 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
16a40 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
16a50 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
16a60 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
16a70 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
16a80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
16a90 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
16aa0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
16ab0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
16ac0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
16ad0 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
16ae0 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
16af0 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
16b00 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
16b10 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
16b20 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
16b30 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
16b40 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
16b50 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
16b60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
16b70 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
16b80 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
16b90 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
16ba0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
16bb0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
16bc0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
16bd0 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
16be0 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
16bf0 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
16c00 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
16c10 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
16c20 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
16c30 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
16c40 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
16c50 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
16c60 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
16c70 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
16c80 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
16c90 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
16ca0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
16cb0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
16cc0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
16cd0 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
16ce0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
16cf0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
16d00 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
16d10 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
16d20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
16d30 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
16d40 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
16d50 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
16d60 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
16d70 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
16d80 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,0);.**.**
16d90 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
16da0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
16db0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
16dc0 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
16dd0 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
16de0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
16df0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
16e00 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
16e10 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
16e20 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
16e30 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
16e40 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
16e50 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
16e60 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
16e70 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
16e80 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
16e90 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
16ea0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
16eb0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
16ec0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
16ed0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
16ee0 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
16ef0 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
16f00 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16f10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
16f20 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
16f30 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
16f40 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
16f50 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
16f60 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
16f70 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
16f80 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
16f90 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
16fa0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
16fb0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
16fc0 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
16fd0 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
16fe0 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
16ff0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
17000 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
17010 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
17020 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17030 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
17040 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
17050 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
17060 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
17070 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
17080 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
17090 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
170a0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
170b0 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
170c0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
170d0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
170e0 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
170f0 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
17100 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
17110 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
17120 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
17130 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
17140 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
17150 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
17160 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b  omToken(pTable);
17170 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
17180 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
17190 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61  eFromToken(pData
171a0 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  base);.  pItem->
171b0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
171c0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
171d0 65 64 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d  ed = 0;.  pList-
171e0 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
171f0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
17200 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
17210 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
17220 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
17230 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
17240 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
17250 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
17260 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
17270 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
17280 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17290 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
172a0 70 4c 69 73 74 20 7c 7c 20 73 71 6c 69 74 65 33  pList || sqlite3
172b0 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
172c0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
172d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
172e0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
172f0 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
17300 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
17310 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
17320 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
17330 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
17340 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
17350 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
17360 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
17370 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17380 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
17390 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
173a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
173b0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
173c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
173d0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
173e0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
173f0 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
17400 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
17410 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
17420 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20  tDelete(SrcList 
17430 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
17440 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
17450 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
17460 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17470 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
17480 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
17490 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
174a0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
174b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
174c0 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
174d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
174e0 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
174f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
17500 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  (pItem->zAlias);
17510 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
17520 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70  teTable(pItem->p
17530 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tab);.    sqlite
17540 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49  3SelectDelete(pI
17550 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
17560 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
17570 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29  lete(pItem->pOn)
17580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
17590 69 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  istDelete(pItem-
175a0 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
175b0 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
175c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
175d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
175e0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
175f0 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
17600 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
17610 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
17620 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
17630 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
17640 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
17650 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17660 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
17670 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
17680 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
17690 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
176a0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
176b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
176c0 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
176d0 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
176e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
176f0 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
17700 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
17710 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
17720 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
17730 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
17740 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
17750 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
17760 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
17770 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
17780 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68   has a alias, th
17790 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
177a0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
177b0 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
177c0 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
177d0 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
177e0 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
177f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
17800 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
17810 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
17820 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
17830 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
17840 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
17850 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
17860 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
17870 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
17880 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
17890 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
178a0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
178b0 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
178c0 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
178d0 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
178e0 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
178f0 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
17900 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
17910 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
17920 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rm(.  SrcList *p
17930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17940 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
17950 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
17960 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
17970 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
17980 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
17990 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
179a0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
179b0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
179c0 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
179d0 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
179e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
179f0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
17a00 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
17a10 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
17a20 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
17a30 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
17a40 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
17a50 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
17a60 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
17a70 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
17a80 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
17a90 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
17aa0 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
17ab0 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
17ac0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
17ad0 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
17ae0 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
17af0 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
17b00 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
17b10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
17b20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
17b30 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
17b40 73 74 41 70 70 65 6e 64 28 70 2c 20 70 54 61 62  stAppend(p, pTab
17b50 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
17b60 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
17b70 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  >nSrc==0 ){.    
17b80 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17b90 65 28 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  e(pOn);.    sqli
17ba0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
17bb0 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  pUsing);.    sql
17bc0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
17bd0 28 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20  (pSubquery);.   
17be0 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20   return p;.  }. 
17bf0 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
17c00 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
17c10 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61   pAlias && pAlia
17c20 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
17c30 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
17c40 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
17c50 28 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20  (pAlias);.  }.  
17c60 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
17c70 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
17c80 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
17c90 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
17ca0 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
17cb0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn p;.}../*.** W
17cc0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
17cd0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
17ce0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
17cf0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
17d00 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
17d10 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
17d20 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
17d30 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
17d40 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
17d50 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
17d60 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
17d70 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
17d80 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
17d90 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
17da0 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
17db0 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
17dc0 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
17dd0 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
17de0 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
17df0 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
17e00 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
17e10 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
17e20 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
17e30 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
17e40 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
17e50 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
17e60 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
17e70 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
17e80 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
17e90 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
17ea0 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
17eb0 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
17ec0 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
17ed0 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
17ee0 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
17ef0 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
17f00 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
17f10 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
17f20 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
17f30 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
17f40 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20   && p->a ){.    
17f50 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
17f60 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
17f70 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
17f80 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
17f90 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
17fa0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
17fb0 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
17fc0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
17fd0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
17fe0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
17ff0 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
18000 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
18010 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
18020 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18030 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
18040 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
18050 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
18060 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
18070 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
18080 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
18090 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
180a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
180b0 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d() ) return;.  
180c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
180d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
180e0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
180f0 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
18100 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
18110 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18120 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
18130 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
18140 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
18150 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
18160 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
18170 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
18180 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18190 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
181a0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
181b0 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d  USIVE)+1);.    }
181c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
181d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
181e0 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
181f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
18200 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
18210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
18220 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
18230 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
18240 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18250 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
18260 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
18270 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
18280 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
18290 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
182a0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
182b0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
182c0 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
182d0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
182e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
182f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
18300 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
18310 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
18320 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
18330 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
18340 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
18350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18360 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
18370 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
18380 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
18390 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
183a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
183b0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
183c0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
183d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
183e0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
183f0 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
18400 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
18410 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
18420 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
18430 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
18440 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d  nErr || sqlite3M
18450 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20  allocFailed() ) 
18460 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
18470 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18480 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
18490 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
184a0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
184b0 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
184c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
184d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
184e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
184f0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
18500 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
18510 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
18520 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
18530 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
18540 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
18550 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
18560 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
18570 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
18580 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
18590 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
185a0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
185b0 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
185c0 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
185d0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
185e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
185f0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
18600 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
18610 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
18620 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  n ){.    int rc 
18630 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  = sqlite3BtreeFa
18640 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20  ctory(db, 0, 0, 
18650 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
18660 41 43 48 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20  ACHE_SIZE,.     
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d              &db-
18690 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[1].pBt);.  
186a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
186b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
186c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
186d0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
186e0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
186f0 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
18700 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
18710 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
18720 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
18730 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
18740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
18750 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
18760 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e  b->flags & !db->
18770 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
18780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18790 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
187a0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20  db->aDb[1].pBt, 
187b0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
187c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
187d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
187e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
187f0 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61 20  unable to get a 
18800 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a  write lock on ".
18810 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 74            "the t
18820 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
18830 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20  e file");.      
18840 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
18850 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  c;.        retur
18860 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
18870 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
18880 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
18890 61 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  a );.  }.  retur
188a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
188b0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
188c0 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
188d0 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
188e0 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
188f0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
18900 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
18910 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
18920 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
18930 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
18940 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
18950 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
18960 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
18970 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
18980 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
18990 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
189a0 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
189b0 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
189c0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
189d0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
189e0 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
189f0 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
18a00 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
18a10 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
18a20 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
18a30 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
18a40 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
18a50 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68  de an OP_Goto th
18a60 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
18a70 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
18a80 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18a90 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
18aa0 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
18ab0 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
18ac0 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
18ad0 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
18ae0 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
18af0 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
18b00 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
18b10 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
18b20 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
18b30 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
18b40 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
18b50 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
18b60 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
18b70 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
18b80 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
18b90 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
18ba0 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  to P2 value.** w
18bb0 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
18bc0 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
18bd0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
18be0 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
18bf0 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
18c00 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
18c10 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
18c20 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
18c30 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  oding()..**.** I
18c40 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64  f iDb<0 then cod
18c50 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e  e the OP_Goto on
18c60 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66  ly - don't set f
18c70 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  lag to verify th
18c80 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61  e.** schema on a
18c90 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54  ny databases.  T
18ca0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
18cb0 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  to position the 
18cc0 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79  OP_Goto.** early
18cd0 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65   in the code, be
18ce0 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20  fore we know if 
18cf0 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62  any database tab
18d00 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  les will be used
18d10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18d20 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
18d30 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
18d40 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
18d50 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
18d60 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   *v;.  int mask;
18d70 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
18d80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
18d90 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
18da0 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e  urn;  /* This on
18db0 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  ly happens if th
18dc0 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20  ere was a prior 
18dd0 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20  error */.  db = 
18de0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
18df0 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
18e00 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Goto==0 ){.    p
18e10 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
18e20 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
18e30 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
18e40 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
18e50 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
18e60 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
18e70 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
18e80 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
18e90 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
18ea0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
18eb0 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
18ec0 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
18ed0 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
18ee0 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
18ef0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
18f00 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
18f10 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
18f20 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
18f30 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
18f40 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
18f50 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
18f60 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
18f70 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
18f80 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
18f90 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
18fa0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
18fb0 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
18fc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18fd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
18fe0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
18ff0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
19000 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
19010 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
19020 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
19030 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
19040 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
19050 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19060 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
19070 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
19080 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
19090 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
190a0 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
190b0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
190c0 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
190d0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
190e0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
190f0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
19100 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
19110 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
19120 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
19130 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
19140 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
19150 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
19160 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
19170 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
19180 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
19190 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
191a0 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
191b0 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
191c0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
191d0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
191e0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
191f0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
19200 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
19210 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
19220 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
19230 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
19240 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
19250 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
19260 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
19270 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
19280 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
19290 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
192a0 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
192b0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
192c0 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
192d0 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
192e0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
192f0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
19300 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
19310 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
19320 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
19330 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
19340 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
19350 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
19360 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
19370 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
19380 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
19390 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
193a0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
193b0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
193c0 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
193d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
193e0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
193f0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
19400 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
19410 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
19420 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
19430 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
19440 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
19450 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
19460 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
19470 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
19480 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
19490 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
194a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
194b0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
194c0 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
194d0 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
194e0 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
194f0 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
19500 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
19510 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
19520 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
19530 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
19540 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
19550 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
19560 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
19570 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
19580 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
19590 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
195a0 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
195b0 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
195c0 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
195d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
195e0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
195f0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
19600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
19610 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
19620 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
19630 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
19640 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
19650 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19660 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
19670 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d  l[i];.    if( z=
19680 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20  =zColl || (z && 
19690 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  zColl && 0==sqli
196a0 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
196b0 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  oll)) ){.      r
196c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
196d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
196e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
196f0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
19700 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
19710 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
19720 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
19730 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
19740 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
19750 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
19760 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
19770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
19780 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
19790 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
197a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
197b0 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
197c0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
197d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
197f0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
19800 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
19810 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
19820 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
19830 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
19840 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
19850 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
19860 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
19870 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
19880 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
19890 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
198a0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
198b0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
198c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
198d0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
198e0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
198f0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
19900 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
19910 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
19920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
19930 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
19940 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
19950 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
19960 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
19970 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
19980 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
19990 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
199a0 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
199b0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
199c0 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
199d0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
199e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
199f0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
19a00 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
19a10 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
19a20 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
19a30 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
19a40 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
19a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19a60 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
19a70 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
19aa0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
19ab0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
19ac0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
19ad0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
19ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
19af0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
19b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19b10 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
19b20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
19b30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19b50 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
19b60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
19b70 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
19b80 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
19b90 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
19ba0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
19bb0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
19bc0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
19bd0 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
19be0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
19bf0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
19c00 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
19c10 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
19c20 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
19c30 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
19c40 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19c50 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
19c60 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
19c70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19c80 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
19c90 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
19ca0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
19cd0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
19ce0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
19cf0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
19d00 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
19d10 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
19d20 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
19d30 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
19d40 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
19d50 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
19d60 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
19d70 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
19d80 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
19d90 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
19da0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
19db0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
19dc0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
19dd0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
19de0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
19df0 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
19e00 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
19e10 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
19e20 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
19e30 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
19e40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
19e50 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
19e60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
19e70 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
19e80 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
19e90 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
19ea0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
19eb0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
19ec0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
19ed0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
19ee0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
19ef0 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
19f00 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
19f10 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
19f40 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
19f50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
19f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19f70 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
19f80 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
19f90 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
19fa0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
19fb0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19fc0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
19fd0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
19fe0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
19ff0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1a000 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1a030 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1a040 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1a050 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1a060 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1a070 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1a080 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1a090 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1a0a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1a0b0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1a0c0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1a0d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1a0e0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1a0f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a100 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1a110 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1a120 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1a130 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1a140 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1a150 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1a160 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1a170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1a180 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1a190 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e  1==0 || pName1->
1a1a0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  z==0 ){.    rein
1a1b0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1a1c0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1a1d0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1a1e0 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e   pName2==0 || pN
1a1f0 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
1a200 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
1a210 2d 3e 7a 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ->z );.    pColl
1a220 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1a230 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1a240 29 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 31  ), (char*)pName1
1a250 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20  ->z, pName1->n, 
1a260 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1a270 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  l ){.      char 
1a280 2a 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53  *zColl = sqliteS
1a290 74 72 4e 44 75 70 28 28 63 6f 6e 73 74 20 63 68  trNDup((const ch
1a2a0 61 72 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20  ar *)pName1->z, 
1a2b0 70 4e 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20 20  pName1->n);.    
1a2c0 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20    if( zColl ){. 
1a2d0 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61         reindexDa
1a2e0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
1a2f0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zColl);.        
1a300 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 6c  sqliteFree(zColl
1a310 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a320 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1a330 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1a340 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1a350 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1a360 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1a370 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1a380 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1a390 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a3a0 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  en(pObjName);.  
1a3b0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1a3c0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
1a3d0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1a3e0 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
1a3f0 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
1a400 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1a410 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
1a420 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
1a430 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  (z);.    return;
1a440 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1a450 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1a460 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1a470 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
1a480 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
1a490 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1a4a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1a4b0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1a4c0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a4d0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a4e0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
1a4f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
1a500 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a510 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1a520 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
1a530 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
1a540 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
1a550 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1a560 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61  dynamicly alloca
1a570 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  ted KeyInfo stru
1a580 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62  cture that can b
1a590 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f  e used.** with O
1a5a0 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
1a5b0 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63  _OpenWrite to ac
1a5c0 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e  cess database in
1a5d0 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
1a5e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  If successful, a
1a5f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a600 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73  new structure is
1a610 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
1a620 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63  is case.** the c
1a630 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1a640 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1a650 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e   sqliteFree() on
1a660 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1a670 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1a680 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1a690 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1a6a0 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1a6b0 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1a6c0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1a6d0 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1a6e0 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1a6f0 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1a700 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1a710 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1a720 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1a730 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1a740 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1a750 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1a760 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1a770 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1a780 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1a790 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1a7a0 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1a7b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
1a7c0 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
1a7d0 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73  iteMalloc(nBytes
1a7e0 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1a7f0 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  {.    pKey->aSor
1a800 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1a810 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1a820 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1a830 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1a840 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1a850 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1a860 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1a870 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1a880 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1a890 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1a8a0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1a8b0 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1a8c0 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1a8d0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1a8e0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1a8f0 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zColl, -1);.    
1a900 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1a910 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
1a920 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
1a930 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69   }.    pKey->nFi
1a940 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a  eld = nCol;.  }.
1a950 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1a960 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
1a970 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  eFree(pKey);.   
1a980 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20   pKey = 0;.  }. 
1a990 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.