/ Hex Artifact Content
Login

Artifact b8437e81e1e10a8fedda0b6209bb05c83e93a844:


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 33 39 32 20 32 30 30 36 2f 30 33 2f 32 33  1.392 2006/03/23
02f0: 20 32 33 3a 33 33 3a 32 37 20 64 72 68 20 45 78   23:33:27 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  k *p;..  if( 0==
08e0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
08f0: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
0900: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 69 44  SharedData || iD
0910: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
0920: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0930: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0940: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0950: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0960: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0970: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0980: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
09a0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
09b0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
09c0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
09d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09e0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09f0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
0a00: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
0a10: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
0a20: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72   sqliteReallocOr
0a30: 46 72 65 65 28 28 76 6f 69 64 20 2a 2a 29 26 70  Free((void **)&p
0a40: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a50: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a60: 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65  ( pParse->aTable
0a70: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20  Lock ){.    p = 
0a80: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0a90: 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62  ock[pParse->nTab
0aa0: 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70  leLock++];.    p
0ab0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
0ac0: 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b   p->iTab = iTab;
0ad0: 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c  .    p->isWriteL
0ae0: 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63  ock = isWriteLoc
0af0: 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20  k;.    p->zName 
0b00: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a  = zName;.  }.}..
0b10: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
0b20: 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72  _TableLock instr
0b30: 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  uction for each 
0b40: 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20  table locked by 
0b50: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
0b60: 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20   (configured by 
0b70: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
0b80: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f  TableLock())..*/
0b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
0ba0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73  eTableLocks(Pars
0bb0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
0bc0: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  t i;.  Vdbe *pVd
0bd0: 62 65 3b 20 0a 20 20 61 73 73 65 72 74 28 20 73  be; .  assert( s
0be0: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
0bf0: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
0c00: 68 61 72 65 64 44 61 74 61 20 7c 7c 20 70 50 61  haredData || pPa
0c10: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3d  rse->nTableLock=
0c20: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  =0 );..  if( 0==
0c30: 28 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  (pVdbe = sqlite3
0c40: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
0c50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
0c60: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20    }..  for(i=0; 
0c70: 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  i<pParse->nTable
0c80: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
0c90: 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20 26  TableLock *p = &
0ca0: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0cb0: 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 70  ck[i];.    int p
0cc0: 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20 20  1 = p->iDb;.    
0cd0: 69 66 28 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f  if( p->isWriteLo
0ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 31 20 3d  ck ){.      p1 =
0cf0: 20 2d 31 2a 28 70 31 2b 31 29 3b 0a 20 20 20 20   -1*(p1+1);.    
0d00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
0d10: 65 4f 70 33 28 70 56 64 62 65 2c 20 4f 50 5f 54  eOp3(pVdbe, OP_T
0d20: 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d  ableLock, p1, p-
0d30: 3e 69 54 61 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  >iTab, p->zName,
0d40: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P3_STATIC);.  }
0d50: 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69  .}.#else.  #defi
0d60: 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ne codeTableLock
0d70: 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s(x).#endif../*.
0d80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0d90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
0da0: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61  a single SQL sta
0db0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0dc0: 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61 20  ** parsed and a 
0dd0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20  VDBE program to 
0de0: 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74 61  execute that sta
0df0: 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a  tement has been.
0e00: 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  ** prepared.  Th
0e10: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20  is routine puts 
0e20: 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f  the finishing to
0e30: 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  uches on the.** 
0e40: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64  VDBE program and
0e50: 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61 72   resets the pPar
0e60: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
0e70: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72   the next.** par
0e80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  se..**.** Note t
0e90: 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20  hat if an error 
0ea0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67  occurred, it mig
0eb0: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
0ec0: 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63  hat.** no VDBE c
0ed0: 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74 65  ode was generate
0ee0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
0ef0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50  e3FinishCoding(P
0f00: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
0f10: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
0f20: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
0f30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
0f40: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
0f50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
0f60: 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  sted ) return;. 
0f70: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 56   if( !pParse->pV
0f80: 64 62 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  dbe ){.    if( p
0f90: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
0fa0: 45 5f 4f 4b 20 26 26 20 70 50 61 72 73 65 2d 3e  E_OK && pParse->
0fb0: 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70 50  nErr ){.      pP
0fc0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
0fd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 72  E_ERROR;.      r
0fe0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
0ff0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
1000: 67 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20  generating some 
1010: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
1020: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1030: 68 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f  he.  ** vdbe pro
1040: 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  gram.  */.  db =
1050: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
1060: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1070: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1080: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a0: 5f 48 61 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20  _Halt, 0, 0);.. 
10b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
10c0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
10d0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
10e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
10f0: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1100: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1110: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1120: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1130: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1140: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1150: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1160: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1170: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
1180: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1190: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
11a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
11b0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
11c0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
11d0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
11e0: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
11f0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
1200: 6f 6b 69 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20  okieGoto>0 ){.  
1210: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20      u32 mask;.  
1220: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1240: 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65  mpHere(v, pParse
1250: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b  ->cookieGoto-1);
1260: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
1270: 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62  , mask=1; iDb<db
1280: 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c  ->nDb; mask<<=1,
1290: 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iDb++){.       
12a0: 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61   if( (mask & pPa
12b0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29  rse->cookieMask)
12c0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
12d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
12f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c  ransaction, iDb,
1300: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1310: 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b  >writeMask)!=0);
1320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1340: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44  VerifyCookie, iD
1350: 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  b, pParse->cooki
1360: 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20  eValue[iDb]);.  
1370: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1380: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
1390: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
13a0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
13b0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
13c0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
13d0: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
13e0: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
13f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1400: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1410: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1420: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1430: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1440: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1450: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1470: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1480: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1490: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  o);.    }..#ifnd
14a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
14b0: 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64 64 20  RACE.    /* Add 
14c0: 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63 6f 6e  a No-op that con
14d0: 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c 65  tains the comple
14e0: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
14f0: 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20 20 20  ompiled SQL.    
1500: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  ** statement as 
1510: 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e 74 2e  its P3 argument.
1520: 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f 74 20    This does not 
1530: 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e 63 74  change the funct
1540: 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a 20  ionality.    ** 
1550: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
1560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1570: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 69  his is used to i
1580: 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
1590: 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20 2a 2f  _trace()..    */
15a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15b0: 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70 2c 20  Op3(v, OP_Noop, 
15c0: 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53  0, 0, pParse->zS
15d0: 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54 61 69  ql, pParse->zTai
15e0: 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c 29 3b  l-pParse->zSql);
15f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1600: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
1610: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1620: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1630: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1640: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
1650: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
1660: 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 4d  ==0 && !sqlite3M
1670: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
1680: 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65  .    FILE *trace
1690: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
16a0: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
16b0: 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20  )!=0 ? stdout : 
16c0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
16d0: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
16e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16f0: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
1700: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61  Parse->nVar, pPa
1710: 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20  rse->nMem+3,.   
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
1740: 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78  ab+3, pParse->ex
1750: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
1760: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1770: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
1780: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
1790: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
17a0: 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
17b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72  E_OK ){.    pPar
17c0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
17d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61  ERROR;.  }.  pPa
17e0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20  rse->nTab = 0;. 
17f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20   pParse->nMem = 
1800: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  0;.  pParse->nSe
1810: 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  t = 0;.  pParse-
1820: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61  >nVar = 0;.  pPa
1830: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1840: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
1850: 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d  ookieGoto = 0;.}
1860: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20  ../*.** Run the 
1870: 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20  parser and code 
1880: 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73  generator recurs
1890: 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ively in order t
18a0: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  o generate.** co
18b0: 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73  de for the SQL s
18c0: 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f  tatement given o
18d0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
18e0: 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78  he pParse contex
18f0: 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  t.** currently u
1900: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1910: 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72  n.  When the par
1920: 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72  ser is run recur
1930: 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77  sively.** this w
1940: 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50  ay, the final OP
1950: 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70  _Halt is not app
1960: 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20  ended and other 
1970: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a  initialization.*
1980: 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69  * and finalizati
1990: 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69  on steps are omi
19a0: 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f  tted because tho
19b0: 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20  se are handling 
19c0: 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d  by the.** outerm
19d0: 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a  ost parser..**.*
19e0: 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67  * Not everything
19f0: 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54   is nestable.  T
1a00: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
1a10: 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d  designed to perm
1a20: 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  it.** INSERT, UP
1a30: 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45  DATE, and DELETE
1a40: 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69   operations agai
1a50: 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  nst SQLITE_MASTE
1a60: 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20  R.  Use.** care 
1a70: 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f  if you decide to
1a80: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73   try to use this
1a90: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d   routine for som
1aa0: 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73  e other purposes
1ab0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ac0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72  3NestedParse(Par
1ad0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
1ae0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1af0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1b00: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
1b10: 6c 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  l;.# define SAVE
1b20: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1b30: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1b40: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1b50: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1b60: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1b70: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1b80: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1b90: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1ba0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1bb0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1bc0: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1bd0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1be0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1bf0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1c00: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
1c10: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1c20: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
1c30: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a      return;   /*
1c40: 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68   A malloc must h
1c50: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1c60: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  }.  pParse->nest
1c70: 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73  ed++;.  memcpy(s
1c80: 61 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d  aveBuf, &pParse-
1c90: 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b  >nVar, SAVE_SZ);
1ca0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
1cb0: 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45  e->nVar, 0, SAVE
1cc0: 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _SZ);.  sqlite3R
1cd0: 75 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c  unParser(pParse,
1ce0: 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73 71 6c   zSql, 0);.  sql
1cf0: 69 74 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20  iteFree(zSql);. 
1d00: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1d10: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1d20: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1d30: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1d40: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1d50: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1d60: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1d70: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
1d80: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
1d90: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
1da0: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
1db0: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
1dc0: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
1dd0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
1de0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1df0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1e00: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1e10: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
1e20: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
1e30: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
1e40: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
1e50: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
1e60: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
1e70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
1e80: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
1e90: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
1ea0: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
1eb0: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
1ec0: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
1ed0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
1ee0: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
1ef0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
1f00: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
1f10: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
1f20: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1f30: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1f40: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
1f50: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
1f60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1f70: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
1f80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
1f90: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
1fa0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
1fb0: 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
1fc0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  =0 );.  for(i=OM
1fd0: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
1fe0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1ff0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2000: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
2010: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
2020: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
2030: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
2040: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2050: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
2060: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
2070: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
2080: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2090: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  (&db->aDb[j].pSc
20a0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
20b0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
20c0: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  me)+1);.    if( 
20d0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
20e0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
20f0: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2100: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2110: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
2120: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
2130: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
2140: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
2150: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
2160: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
2170: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
2180: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
2190: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
21a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
21b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73   not found.  Als
21c0: 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72  o leave an.** er
21d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
21e0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
21f0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
2200: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2210: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
2220: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2230: 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
2240: 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20   routine leaves 
2250: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2260: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
2270: 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c  Msg where.** sql
2280: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2290: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62  does not..*/.Tab
22a0: 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  le *sqlite3Locat
22b0: 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  eTable(Parse *pP
22c0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
22d0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
22e0: 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20  har *zDbase){.  
22f0: 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Table *p;..  /* 
2300: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
2310: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
2320: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
2330: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
2340: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
2350: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
2360: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
2370: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
2380: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
2390: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
23a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
23b0: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
23c0: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
23d0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
23e0: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
23f0: 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73  ){.    if( zDbas
2400: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2410: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2420: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
2430: 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73  e: %s.%s", zDbas
2440: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
2450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2460: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2470: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
2480: 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  le: %s", zName);
2490: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
24a0: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
24b0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
24c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
24d0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
24e0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
24f0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
2500: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
2510: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
2520: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
2530: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
2540: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2550: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2560: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
2570: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2580: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2590: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
25a0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
25b0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
25c0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
25d0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
25e0: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
25f0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
2600: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
2610: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
2620: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2630: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
2640: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2650: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2660: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2670: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
2680: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2690: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
26a0: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
26b0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
26d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
26e0: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
26f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2700: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2710: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2720: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2730: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2740: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2750: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2760: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
2770: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  ema = db->aDb[j]
2780: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66  .pSchema;.    if
2790: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
27a0: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
27b0: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
27c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
27d0: 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 7c  ssert( pSchema |
27e0: 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e  | (j==1 && !db->
27f0: 61 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20  aDb[1].pBt) );. 
2800: 20 20 20 69 66 28 20 70 53 63 68 65 6d 61 20 29     if( pSchema )
2810: 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  {.      p = sqli
2820: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
2830: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2840: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
2850: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  me)+1);.    }.  
2860: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
2870: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
2880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
2890: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
28a0: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
28b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
28c0: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
28d0: 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  {.  sqliteFree(p
28e0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
28f0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
2900: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2910: 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f   given index fro
2920: 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  m the index hash
2930: 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65   table, and free
2940: 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73  .** its memory s
2950: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a  tructures..**.**
2960: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65   The index is re
2970: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64  moved from the d
2980: 61 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62  atabase hash tab
2990: 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73  les but.** it is
29a0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72   not unlinked fr
29b0: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61  om the Table tha
29c0: 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  t it indexes..**
29d0: 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20   Unlinking from 
29e0: 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62  the Table must b
29f0: 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61  e done by the ca
2a00: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
2a10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2a20: 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78  qliteDeleteIndex
2a30: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e  (Index *p){.  In
2a40: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e  dex *pOld;.  con
2a50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2a60: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f   p->zName;..  pO
2a70: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2a80: 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
2a90: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
2aa0: 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e 61 6d  me, strlen( zNam
2ab0: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  e)+1, 0);.  asse
2ac0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
2ad0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65  Old==p );.  free
2ae0: 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Index(p);.}../*.
2af0: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2b00: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2b10: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2b20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2b30: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2b40: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2b50: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2b60: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2b70: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2b80: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2b90: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2ba0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2bb0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2bc0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2bd0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2be0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
2bf0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2c00: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2c10: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
2c20: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
2c30: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
2c40: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2c50: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
2c60: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
2c70: 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65 29 3b  trlen(zIdxName);
2c80: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2c90: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2ca0: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2cb0: 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  en+1, 0);.  if( 
2cc0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66  pIndex ){.    if
2cd0: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
2ce0: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
2cf0: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
2d00: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2d10: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
2d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d30: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
2d40: 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d     for(p=pIndex-
2d50: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2d60: 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d   p && p->pNext!=
2d70: 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65  pIndex; p=p->pNe
2d80: 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  xt){}.      if( 
2d90: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
2da0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
2db0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
2dc0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
2dd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
2de0: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
2df0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
2e00: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
2e10: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
2e20: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
2e30: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
2e40: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
2e50: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
2e60: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74  .** a single dat
2e70: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
2e80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
2e90: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
2ea0: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
2eb0: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
2ec0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
2ed0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
2ee0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
2ef0: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
2f00: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
2f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
2f20: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
2f30: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
2f40: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
2f50: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
2f60: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
2f70: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
2f80: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
2f90: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
2fa0: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
2fb0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
2fc0: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
2fd0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
2fe0: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
2ff0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
3000: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
3010: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3020: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20  {.  int i, j;.. 
3030: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
3040: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
3050: 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  ;.  for(i=iDb; i
3060: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3070: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3080: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3090: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
30a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30b0: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
30c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
30d0: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
30e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
30f0: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
3100: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3110: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3120: 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  nges;..  /* If o
3130: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3140: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3150: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3160: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3170: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
3180: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
3190: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
31a0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
31b0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
31c0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
31d0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
31e0: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
31f0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3200: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3210: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3220: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3230: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3240: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3250: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3270: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3280: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
3290: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
32a0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
32b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
32c0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
32d0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
32e0: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
32f0: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3300: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3310: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3320: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3330: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3340: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3350: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3360: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3370: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44 62    sqliteFree(pDb
3380: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
3390: 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  pDb->zName = 0;.
33a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
33b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
33c0: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
33d0: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
33e0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
33f0: 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  +;.  }.  memset(
3400: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20  &db->aDb[j], 0, 
3410: 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65  (db->nDb-j)*size
3420: 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b  of(db->aDb[j]));
3430: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a  .  db->nDb = j;.
3440: 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32    if( db->nDb<=2
3450: 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d   && db->aDb!=db-
3460: 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20  >aDbStatic ){.  
3470: 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62    memcpy(db->aDb
3480: 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c  Static, db->aDb,
3490: 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44   2*sizeof(db->aD
34a0: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69  b[0]));.    sqli
34b0: 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29 3b  teFree(db->aDb);
34c0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
34d0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
34e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
34f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3500: 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  d whenever a rol
3510: 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20 49  lback occurs.  I
3520: 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a 20  f there were.** 
3530: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
3540: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
3550: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20 68  ction, then we h
3560: 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  ave to reset the
3570: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  .** internal has
3580: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65 6c  h tables and rel
3590: 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64 69  oad them from di
35a0: 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sk..*/.void sqli
35b0: 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72  te3RollbackInter
35c0: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
35d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
35e0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
35f0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
3600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
3610: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
3620: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
3630: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3640: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3650: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
3660: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
3670: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
3680: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
3690: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
36a0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
36b0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
36c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
36d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
36e0: 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  m a table or vie
36f0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3700: 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c  d sqliteResetCol
3710: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
3720: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
3730: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
3740: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
3750: 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  le!=0 );.  if( (
3760: 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61  pCol = pTable->a
3770: 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  Col)!=0 ){.    f
3780: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
3790: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
37a0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l++){.      sqli
37b0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
37c0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
37d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f  e3ExprDelete(pCo
37e0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
37f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
3800: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
3810: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
3820: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
3830: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54     sqliteFree(pT
3840: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3850: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3860: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3870: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3880: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3890: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
38a0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
38b0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
38c0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
38d0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
38e0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
38f0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3900: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3910: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3920: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3930: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3940: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3950: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3960: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3970: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3980: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3990: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
39a0: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
39b0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
39c0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
39d0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
39e0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
39f0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3a00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3a10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
3a20: 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f  .** Indices asso
3a30: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3a40: 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b  table are unlink
3a50: 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22  ed from the "db"
3a60: 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74 75  .** data structu
3a70: 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20  re if db!=NULL. 
3a80: 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e   If db==NULL, in
3a90: 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20 74  dices attached t
3aa0: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61  o.** the table a
3ab0: 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20  re deleted, but 
3ac0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
3ad0: 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ey have already 
3ae0: 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64  been.** unlinked
3af0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3b00: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  3DeleteTable(sql
3b10: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
3b20: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65  *pTable){.  Inde
3b30: 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78  x *pIndex, *pNex
3b40: 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  t;.  FKey *pFKey
3b50: 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20  , *pNextFKey;.. 
3b60: 20 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20   db = 0;..  if( 
3b70: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
3b80: 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  rn;..  /* Do not
3b90: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
3ba0: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
3bb0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3bc0: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3bd0: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3be0: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3bf0: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3c00: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3c10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3c20: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3c30: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3c40: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3c50: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
3c60: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
3c70: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
3c80: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
3c90: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3ca0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3cb0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3cc0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
3cd0: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
3ce0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e    sqliteDeleteIn
3cf0: 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3d20: 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  Y.  /* Delete al
3d30: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
3d40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3d50: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
3d60: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
3d70: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3d80: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
3d90: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
3da0: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
3db0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
3dc0: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
3dd0: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
3de0: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
3df0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
3e00: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
3e10: 28 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  ( sqlite3HashFin
3e20: 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  d(&pTable->pSche
3e30: 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20 20 20  ma->aFKey,.     
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
3e60: 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  , strlen(pFKey->
3e70: 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29  zTo)+1)!=pFKey )
3e80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3e90: 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  (pFKey);.  }.#en
3ea0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
3eb0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
3ec0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
3ed0: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3ee0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3ef0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
3f00: 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b  (pTable->zName);
3f10: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
3f20: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  able->zColAff);.
3f30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3f40: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53  elete(pTable->pS
3f50: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
3f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
3f70: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
3f80: 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43  elete(pTable->pC
3f90: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3fa0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
3fb0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  e);.}../*.** Unl
3fc0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
3fd0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
3fe0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
3ff0: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
4000: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
4010: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
4020: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
4030: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
4040: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
4050: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
4060: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
4070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
4080: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
4090: 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  p;.  FKey *pF1, 
40a0: 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b  *pF2;.  Db *pDb;
40b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
40c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
40d0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
40e0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
40f0: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54  ( zTabName && zT
4100: 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70  abName[0] );.  p
4110: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
4120: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
4130: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
4140: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
4150: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74  sh, zTabName, st
4160: 72 6c 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31  rlen(zTabName)+1
4170: 2c 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ,0);.  if( p ){.
4180: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4190: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
41a0: 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70      for(pF1=p->p
41b0: 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70  FKey; pF1; pF1=p
41c0: 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  F1->pNextFrom){.
41d0: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20        int nTo = 
41e0: 73 74 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29  strlen(pF1->zTo)
41f0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20   + 1;.      pF2 
4200: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
4210: 64 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  d(&pDb->pSchema-
4220: 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f  >aFKey, pF1->zTo
4230: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66  , nTo);.      if
4240: 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20  ( pF2==pF1 ){.  
4250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
4260: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
4270: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
4280: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31  1->zTo, nTo, pF1
4290: 2d 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20  ->pNextTo);.    
42a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
42b0: 20 77 68 69 6c 65 28 20 70 46 32 20 26 26 20 70   while( pF2 && p
42c0: 46 32 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31  F2->pNextTo!=pF1
42d0: 20 29 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65   ){ pF2=pF2->pNe
42e0: 78 74 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20  xtTo; }.        
42f0: 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20  if( pF2 ){.     
4300: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
4310: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
4320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4330: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
4340: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
4350: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
4360: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
4370: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
4380: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
4390: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
43a0: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
43b0: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
43c0: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
43d0: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68  at.** token with
43e0: 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20   any quotations 
43f0: 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20  removed.  Space 
4400: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4410: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4420: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4430: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4440: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
4450: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
4460: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
4470: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
4480: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
4490: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
44a0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
44b0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
44c0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
44d0: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
44e0: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
44f0: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4500: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4510: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4520: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4530: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4540: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
4550: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
4560: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
4570: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
4580: 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a  teStrNDup((char*
4590: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
45a0: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
45b0: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
45c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
45d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
45e0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
45f0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
4600: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
4610: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
4620: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
4630: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
4640: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
4650: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
4660: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
4670: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
4680: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
4690: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
46a0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
46b0: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
46c0: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
46d0: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
46e0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
46f0: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
4700: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4710: 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
4720: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4730: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
4740: 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52  ite, 0, MASTER_R
4750: 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  OOT);.  sqlite3V
4760: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4770: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
4780: 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d   5); /* sqlite_m
4790: 61 73 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75  aster has 5 colu
47a0: 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mns */.}../*.** 
47b0: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
47c0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
47d0: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
47e0: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
47f0: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
4800: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4810: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4820: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
4830: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
4840: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
4850: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
4860: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
4870: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
4880: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
4890: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
48a0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
48b0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
48c0: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f  int i = -1;    /
48d0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
48e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  r */.  int n;   
48f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4900: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
4910: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44   the name */.  D
4920: 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a  b *pDb;       /*
4930: 20 41 20 64 61 74 61 62 61 73 65 20 77 68 6f 73   A database whos
4940: 65 20 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20  e name space is 
4950: 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a  being searched *
4960: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
4970: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
4980: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
4990: 2a 2f 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  */..  zName = sq
49a0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
49b0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(pName);.  if(
49c0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20   zName ){.    n 
49d0: 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
49e0: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
49f0: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
4a00: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
4a10: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
4a20: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
4a30: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
4a40: 20 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e   n==strlen(pDb->
4a50: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
4a60: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
4a70: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
4a80: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
4a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
4ab0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4ac0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
4ad0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
4ae0: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
4af0: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
4b00: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
4b10: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
4b20: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
4b30: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
4b40: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
4b50: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
4b60: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
4b70: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
4b80: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
4b90: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
4ba0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
4bb0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
4bc0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
4bd0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
4be0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
4bf0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
4c00: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
4c10: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
4c20: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
4c30: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
4c40: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
4c50: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
4c60: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
4c70: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
4c80: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
4c90: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
4ca0: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
4cb0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
4cc0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
4cd0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
4ce0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
4cf0: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
4d00: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
4d10: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
4d20: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4d30: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
4d40: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
4d50: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
4d60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4d70: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
4d80: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
4d90: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
4da0: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
4db0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
4dc0: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
4dd0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4de0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
4df0: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
4e00: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
4e10: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
4e20: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
4e30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
4e40: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4e50: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
4e60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4e70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4e80: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61  ->db;..  if( pNa
4e90: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
4ea0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
4eb0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
4ec0: 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c   );.    *pUnqual
4ed0: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
4ee0: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
4ef0: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
4f00: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
4f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
4f20: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4f30: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
4f40: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
4f50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4f60: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4f70: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
4f80: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4f90: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
4fa0: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
4fb0: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
4fc0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
4fd0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
4fe0: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
4ff0: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
5000: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
5010: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
5020: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
5030: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
5040: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
5050: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
5060: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
5070: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
5080: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
5090: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
50a0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
50b0: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
50c0: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
50d0: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
50e0: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
50f0: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
5100: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5110: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
5120: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5130: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
5140: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
5150: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
5160: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
5170: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
5180: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
5190: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
51a0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
51b0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
51c0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
51d0: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
51e0: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
51f0: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
5200: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
5210: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
5220: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5230: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
5240: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
5250: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5260: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
5270: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5280: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
52a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
52b0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
52c0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
52d0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
52e0: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
52f0: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5300: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5310: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5320: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5330: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5340: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5350: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5360: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5370: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
5380: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
5390: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
53a0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
53b0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
53c0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
53d0: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
53e0: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
53f0: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
5400: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
5410: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
5420: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
5430: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
5440: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
5450: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
5460: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
5470: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
5480: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
5490: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
54a0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
54b0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
54c0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
54d0: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
54e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
54f0: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
5500: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5510: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
5520: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
5530: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
5540: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
5550: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
5560: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
5570: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
5580: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
5590: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
55a0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
55b0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
55c0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
55d0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
55e0: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
55f0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
5600: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
5610: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
5620: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5630: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5640: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5650: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
5660: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
5670: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5680: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
5690: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
56a0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
56b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
56c0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
56d0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
56e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
56f0: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
5700: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
5710: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
5720: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
5730: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  VIEW */.  int no
5740: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
5750: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
5760: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
5770: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
5780: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
5790: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
57a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
57b0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
57c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
57d0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
57e0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
57f0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5800: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
5810: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
5820: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5830: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
5840: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
5850: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
5860: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
5870: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
5880: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
5890: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
58a0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
58b0: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
58c0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
58d0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
58e0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
58f0: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
5900: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
5910: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5920: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
5930: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5940: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5950: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5960: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
5970: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
5980: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5990: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
59a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
59b0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
59c0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
59d0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
59e0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
59f0: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
5a00: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
5a10: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
5a20: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
5a30: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5a40: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
5a50: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
5a60: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
5a70: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
5a80: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
5a90: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
5aa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
5ab0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
5ac0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5ad0: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
5ae0: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
5af0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
5b00: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
5b10: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
5b20: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
5b30: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
5b40: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
5b50: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
5b60: 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f  & iDb>1 ){.    /
5b70: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
5b80: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
5b90: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
5ba0: 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20  qualified */.   
5bb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5bc0: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
5bd0: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
5be0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
5bf0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
5c00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49  ;.  }.  if( !OMI
5c10: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5c20: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
5c30: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
5c40: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
5c50: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5c60: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
5c70: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
5c80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5c90: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
5ca0: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
5cb0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
5cc0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
5cd0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
5ce0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
5cf0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
5d00: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
5d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5d20: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
5d30: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
5d40: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
5d50: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
5d60: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
5d70: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
5d80: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
5d90: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
5da0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
5db0: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
5dc0: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
5dd0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
5de0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5df0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
5e00: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
5e10: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
5e20: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
5e30: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
5e40: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
5e50: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
5e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5e70: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5e80: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
5e90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5ea0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5eb0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
5ec0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
5ed0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
5ee0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
5ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5f00: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
5f10: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
5f20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5f30: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5f40: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
5f50: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
5f60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
5f70: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5f80: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
5f90: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
5fa0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
5fb0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
5fc0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
5fd0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
5fe0: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
5ff0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6000: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
6010: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
6020: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   ** it does..  *
6030: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
6040: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
6050: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
6060: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6070: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6080: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6090: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
60a0: 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  zName, db->aDb[i
60b0: 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  Db].zName);.  if
60c0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
60d0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
60e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
60f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
6100: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
6110: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
6120: 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 62 65     }.    goto be
6130: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6140: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
6150: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
6160: 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26 26 20  zName, 0)!=0 && 
6170: 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e  (iDb==0 || !db->
6180: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
6190: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
61a0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
61b0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
61c0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
61d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
61e0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
61f0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
6200: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
6210: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
6220: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
6230: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
6240: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
6250: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
6260: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
6270: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6280: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
6290: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
62a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
62b0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
62c0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
62d0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
62e0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
62f0: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70  = 0;.  pTable->p
6300: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6310: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
6320: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
6330: 31 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  1;.  if( pParse-
6340: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
6350: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
6360: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
6370: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
6380: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
6390: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
63a0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
63b0: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
63c0: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
63d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
63e0: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
63f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
6400: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
6410: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
6420: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
6430: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
6440: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
6450: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
6460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6470: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
6480: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
6490: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
64a0: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
64b0: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
64c0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
64d0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
64e0: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
64f0: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
6500: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
6510: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
6520: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
6530: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
6540: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
6550: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
6560: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
6570: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
6580: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
6590: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
65a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
65b0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
65c0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
65d0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
65e0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
65f0: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
6600: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
6610: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
6620: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
6630: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
6640: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
6650: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
6660: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
6670: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
6680: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
6690: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
66a0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
66b0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
66c0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
66d0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
66e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
66f0: 20 6c 62 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69   lbl;.    int fi
6700: 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71  leFormat;.    sq
6710: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
6720: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
6730: 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f   0, iDb);..    /
6740: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6750: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
6760: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
6770: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
6780: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
6790: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
67a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
67b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61  eAddOp(v, OP_Rea
67c0: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29  dCookie, iDb, 1)
67d0: 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d  ;   /* file_form
67e0: 61 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20  at */.    lbl = 
67f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
6800: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
6810: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6820: 20 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b   OP_If, 0, lbl);
6830: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
6840: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6850: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
6860: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
6870: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
6880: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
6890: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
68a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
68b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
68c0: 66 69 6c 65 46 6f 72 6d 61 74 2c 20 30 29 3b 0a  fileFormat, 0);.
68d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
68f0: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
6900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6910: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
6920: 72 2c 20 45 4e 43 28 64 62 29 2c 20 30 29 3b 0a  r, ENC(db), 0);.
6930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6940: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
6950: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20  okie, iDb, 4);. 
6960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
6970: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
6980: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  l);..    /* This
6990: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
69a0: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
69b0: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
69c0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
69d0: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
69e0: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
69f0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
6a00: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
6a10: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
6a20: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
6a30: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
6a40: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
6a50: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
6a60: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
6a70: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
6a80: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
6a90: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
6aa0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a  he stack..    **
6ab0: 20 54 68 65 20 72 6f 77 69 64 20 76 61 6c 75 65   The rowid value
6ac0: 20 69 73 20 6e 65 65 64 65 64 20 62 79 20 74 68   is needed by th
6ad0: 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
6ae0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
6af0: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
6b00: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
6b10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
6b20: 57 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  W.    if( isView
6b30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6b40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6b50: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
6b60: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
6b70: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71  f.    {.      sq
6b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6b90: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
6ba0: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d  , iDb, 0);.    }
6bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
6bc0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
6bd0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
6be0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6bf0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
6c00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6c10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
6c20: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
6c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c40: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
6c50: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6c60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6c70: 49 6e 73 65 72 74 2c 20 30 2c 20 30 29 3b 0a 20  Insert, 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 43 6c 6f 73 65 2c  dOp(v, OP_Close,
6ca0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6cc0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
6cd0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
6ce0: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
6cf0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
6d00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
6d10: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
6d20: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
6d30: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
6d40: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
6d50: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
6d60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
6d70: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
6d80: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
6d90: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
6da0: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
6db0: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
6dc0: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
6dd0: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
6de0: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
6df0: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
6e00: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
6e10: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
6e20: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
6e30: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
6e40: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
6e50: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
6e60: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
6e70: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
6e80: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
6e90: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
6ea0: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
6eb0: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
6ec0: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
6ed0: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
6ee0: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
6ef0: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
6f00: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
6f10: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
6f20: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
6f30: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
6f40: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
6f50: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
6f60: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
6f70: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
6f80: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
6f90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
6fa0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
6fb0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
6fc0: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
6fd0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
6fe0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6ff0: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
7000: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
7010: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
7020: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7030: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
7040: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
7050: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7060: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
7070: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
7080: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
7090: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
70a0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
70b0: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
70c0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
70d0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
70e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
70f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
7100: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
7110: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7120: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
7130: 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49  +){.    if( STRI
7140: 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  CMP(z, p->aCol[i
7150: 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ].zName) ){.    
7160: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7170: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
7180: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
7190: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
71a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
71b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
71c0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
71d0: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
71e0: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
71f0: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
7200: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
7210: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
7220: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
7230: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
7240: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
7250: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
7260: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7270: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
7280: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
7290: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
72a0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
72b0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
72c0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
72d0: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
72e0: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
72f0: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
7300: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
7310: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
7320: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
7330: 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72   'NONE'. If ther
7340: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
7350: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
7360: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
7370: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
7380: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
7390: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
73a0: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
73b0: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
73c0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
73d0: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  NONE;.  p->nCol+
73e0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
73f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7400: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
7410: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
7420: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
7430: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
7440: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
7450: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
7460: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
7470: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
7480: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
7490: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
74a0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
74b0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
74c0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
74d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
74e0: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
74f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7500: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
7510: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7520: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
7530: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7540: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7550: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
7560: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
7570: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
7580: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
7590: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
75a0: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
75b0: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
75c0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
75d0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
75e0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
75f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7600: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
7610: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
7620: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
7630: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
7640: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
7650: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
7660: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7670: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
7680: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
7690: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
76a0: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
76b0: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
76c0: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
76d0: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
76e0: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
76f0: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
7700: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
7710: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
7720: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
7730: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
7740: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
7750: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
7760: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
7770: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
77a0: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
77b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
77c0: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
77d0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
77e0: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
77f0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7800: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
7810: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
7820: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7830: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
7840: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
7850: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
7860: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
7870: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
7880: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7890: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
78a0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
78b0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
78c0: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
78d0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
78e0: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
78f0: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
7900: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
7910: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
7920: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
7930: 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65  yType(const Toke
7940: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32  n *pType){.  u32
7950: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
7960: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7970: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
7980: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7990: 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a  zIn = pType->z;.
79a0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
79b0: 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70   char *zEnd = &p
79c0: 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e  Type->z[pType->n
79d0: 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ];..  while( zIn
79e0: 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20  !=zEnd ){.    h 
79f0: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
7a00: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
7a10: 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  zIn];.    zIn++;
7a20: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
7a30: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
7a40: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
7a50: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
7a60: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
7a70: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7a80: 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65  TEXT; .    }else
7a90: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
7aa0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
7ab0: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
7ac0: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
7ad0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
7ae0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
7af0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
7b00: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
7b10: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
7b20: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
7b30: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
7b40: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
7b50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
7b60: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
7b70: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
7b80: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
7b90: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
7ba0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
7bb0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
7bc0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7bd0: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
7be0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
7bf0: 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  NONE;.#ifndef SQ
7c00: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
7c10: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
7c20: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
7c30: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
7c40: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
7c50: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
7c60: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
7c70: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
7c80: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
7c90: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
7ca0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
7cb0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
7cc0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
7cd0: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
7ce0: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
7cf0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
7d00: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
7d10: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
7d20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
7d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7d40: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
7d50: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
7d60: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
7d70: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
7d80: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
7d90: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
7da0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7db0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
7dc0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
7dd0: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
7de0: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
7df0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
7e00: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
7e10: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
7e20: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
7e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
7e40: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
7e50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
7e60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
7e70: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
7e80: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
7e90: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
7ea0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7eb0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
7ec0: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
7ed0: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
7ee0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
7ef0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
7f00: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
7f10: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
7f20: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
7f30: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
7f40: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
7f50: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
7f60: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
7f70: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
7f80: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
7f90: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
7fa0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
7fb0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
7fc0: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
7fd0: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
7fe0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
7ff0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8000: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
8010: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
8020: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
8030: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
8040: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28  mn *pCol;..  if(
8050: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8060: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8070: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
8080: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
8090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
80a0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b  l = &p->aCol[i];
80b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43  .  sqliteFree(pC
80c0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
80d0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
80e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
80f0: 28 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  (pType);.  pCol-
8100: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8110: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8120: 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pType);.}../*.**
8130: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8140: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
8150: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
8160: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8170: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
8180: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8190: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
81a0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
81b0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
81c0: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
81d0: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
81e0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
81f0: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
8200: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
8210: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8220: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8230: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8240: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8250: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8260: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8270: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8280: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
8290: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
82a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62  r *pExpr){.  Tab
82b0: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
82c0: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
82d0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
82e0: 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ble)!=0 ){.    p
82f0: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
8300: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
8310: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
8320: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
8330: 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a  ction(pExpr) ){.
8340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8350: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
8360: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
8370: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
8380: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
8390: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
83a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
83b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
83c0: 70 72 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70  prDelete(pCol->p
83d0: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
83e0: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
83f0: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
8400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8410: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8420: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
8430: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
8440: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
8450: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
8460: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
8470: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
8480: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
8490: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
84a0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
84b0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
84c0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
84d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
84e0: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
84f0: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
8500: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
8510: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
8520: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
8530: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
8540: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
8550: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
8560: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
8570: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
8580: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
8590: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
85a0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
85b0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
85c0: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
85d0: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
85e0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
85f0: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
8600: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
8610: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
8620: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
8630: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
8640: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
8650: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
8660: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
8670: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
8680: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
8690: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
86a0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
86b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
86c0: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
86d0: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
86e0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
86f0: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
8700: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
8710: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
8720: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
8730: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
8740: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
8750: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8760: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
8770: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8780: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8790: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
87a0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
87b0: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
87c0: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
87d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
87e0: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
87f0: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
8800: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
8810: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
8820: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
8830: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
8840: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
8850: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
8860: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
8870: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
8880: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
8890: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
88a0: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
88b0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
88c0: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
88d0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
88e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
88f0: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
8900: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
8910: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
8920: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8930: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8940: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
8950: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
8960: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
8970: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
8980: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
8990: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
89a0: 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  .  pTab->hasPrim
89b0: 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Key = 1;.  if( p
89c0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
89d0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
89e0: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
89f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
8a00: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mKey = 1;.  }els
8a10: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
8a20: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
8a30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
8a40: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
8a50: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
8a60: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
8a70: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
8a80: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
8a90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8aa0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
8ab0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8ac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8ad0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8ae0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
8af0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
8b00: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
8b10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8b20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
8b30: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f  t->nExpr>1 ) iCo
8b40: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
8b50: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
8b60: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
8b70: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
8b80: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
8b90: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
8ba0: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
8bb0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
8bc0: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
8bd0: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d     && sortOrder=
8be0: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29  =SQLITE_SO_ASC )
8bf0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
8c00: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
8c10: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e  ab->keyConf = on
8c20: 45 72 72 6f 72 3b 0a 20 20 20 20 70 54 61 62 2d  Error;.    pTab-
8c30: 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75 74 6f 49  >autoInc = autoI
8c40: 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nc;.  }else if( 
8c50: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
8c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8c70: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
8c80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8c90: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
8ca0: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
8cb0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
8cc0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
8cd0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
8ce0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
8cf0: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
8d00: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
8d10: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
8d20: 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72  Error, 0, 0, sor
8d30: 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20  tOrder, 0);.    
8d40: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
8d50: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
8d60: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
8d70: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
8d80: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8d90: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
8da0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
8db0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8dc0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8dd0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
8de0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
8df0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
8e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8e10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8e20: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
8e30: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
8e40: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
8e50: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
8e60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
8e70: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
8e80: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
8e90: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
8ea0: 62 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  b ){.    /* The 
8eb0: 43 48 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e  CHECK expression
8ec0: 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69 63 61   must be duplica
8ed0: 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65  ted so that toke
8ee0: 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20  ns refer.    ** 
8ef0: 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63  to malloced spac
8f00: 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65  e and not the (e
8f10: 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f  phemeral) text o
8f20: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
8f30: 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  LE.    ** statem
8f40: 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ent */.    pTab-
8f50: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
8f60: 33 45 78 70 72 41 6e 64 28 70 54 61 62 2d 3e 70  3ExprAnd(pTab->p
8f70: 43 68 65 63 6b 2c 20 73 71 6c 69 74 65 33 45 78  Check, sqlite3Ex
8f80: 70 72 44 75 70 28 70 43 68 65 63 6b 45 78 70 72  prDup(pCheckExpr
8f90: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
8fa0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8fb0: 74 65 28 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  te(pCheckExpr);.
8fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
8fd0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
8fe0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
8ff0: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
9000: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
9010: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
9020: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
9030: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
9040: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
9050: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
9060: 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65 29  Type, int nType)
9070: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9080: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 28 70  int i;..  if( (p
9090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
90a0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
90b0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
90c0: 2d 31 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  -1;..  if( sqlit
90d0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
90e0: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e  pParse, zType, n
90f0: 54 79 70 65 29 20 29 7b 0a 20 20 20 20 49 6e 64  Type) ){.    Ind
9100: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d  ex *pIdx;.    p-
9110: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
9120: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a   sqliteStrNDup(z
9130: 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20  Type, nType);.  
9140: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
9150: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
9160: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
9170: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
9180: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
9190: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
91a0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
91b0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
91c0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
91d0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
91e0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
91f0: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
9200: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
9210: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
9220: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
9230: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
9240: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
9250: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
9260: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
9270: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
9280: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
9290: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
92a0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
92b0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
92c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
92d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
92e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
92f0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9300: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
9310: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
9320: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
9330: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
9340: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
9350: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
9360: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
9370: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
9380: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
9390: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
93a0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
93b0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
93c0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
93d0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
93e0: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
93f0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
9400: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9410: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
9420: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
9430: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
9440: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
9450: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
9460: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
9470: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
9480: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
9490: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
94a0: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
94b0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
94c0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
94d0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
94e0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
94f0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
9500: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
9510: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
9520: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
9530: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
9540: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
9550: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
9560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9570: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
9580: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9590: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
95a0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
95b0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
95c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
95d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
95e0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
95f0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
9600: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
9610: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
9620: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
9630: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
9640: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
9650: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9660: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62  te3GetCollSeq(db
9670: 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20  , pColl, zName, 
9680: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
9690: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
96a0: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20  if( nName<0 ){. 
96b0: 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73         nName = s
96c0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
96d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
96e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
96f0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
9700: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
9710: 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a   %.*s", nName, z
9720: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f  Name);.      pCo
9730: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ll = 0;.    }.  
9740: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  }..  return pCol
9750: 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  l;.}.../*.** Gen
9760: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
9770: 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74  will increment t
9780: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
9790: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
97a0: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
97b0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
97c0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
97d0: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
97e0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
97f0: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
9800: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
9810: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
9820: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
9830: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
9840: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
9850: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
9860: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
9870: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
9880: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9890: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
98a0: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
98b0: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
98c0: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
98d0: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
98e0: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
98f0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
9900: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
9910: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
9920: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
9930: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
9940: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
9950: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
9960: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
9970: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
9980: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
9990: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
99a0: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
99b0: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
99c0: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
99d0: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
99e0: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
99f0: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
9a00: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
9a10: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
9a20: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
9a30: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
9a40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
9a50: 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b  be *v, int iDb){
9a60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9a70: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9a80: 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  r, db->aDb[iDb].
9a90: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
9aa0: 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20  cookie+1, 0);.  
9ab0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ac0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
9ad0: 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  , iDb, 0);.}../*
9ae0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
9af0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
9b00: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
9b10: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
9b20: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
9b30: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
9b40: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
9b50: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
9b60: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
9b70: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
9b80: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
9b90: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
9ba0: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
9bb0: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
9bc0: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
9bd0: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
9be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
9bf0: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
9c00: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
9c10: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
9c20: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
9c30: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
9c40: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
9c50: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
9c60: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64  *.** Write an id
9c70: 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68  entifier onto th
9c80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76  e end of the giv
9c90: 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a  en string.  Add.
9ca0: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
9cb0: 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ers as needed..*
9cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
9cd0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
9ce0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
9cf0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
9d00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9d10: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
9d20: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
9d30: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
9d40: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
9d50: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f   i = *pIdx;.  fo
9d60: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
9d70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
9d80: 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  !isalnum(zIdent[
9d90: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
9da0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
9db0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
9dc0: 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c    zIdent[j]!=0 |
9dd0: 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74  | isdigit(zIdent
9de0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
9df0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
9e00: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
9e10: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a  ent, j)!=TK_ID;.
9e20: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
9e30: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
9e40: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
9e50: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
9e60: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
9e70: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
9e80: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
9e90: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
9ea0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
9eb0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
9ec0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
9ed0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
9ee0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
9ef0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9f00: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
9f10: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
9f20: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
9f30: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
9f40: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
9f50: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
9f60: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
9f70: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
9f80: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
9f90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
9fa0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
9fb0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54  reateTableStmt(T
9fc0: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 69 73 54  able *p, int isT
9fd0: 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b  emp){.  int i, k
9fe0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
9ff0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
a000: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
a010: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
a020: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
a030: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
a040: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
a050: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
a060: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
a070: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
a080: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
a090: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
a0a0: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
a0b0: 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31  = (strlen(z) + 1
a0c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
a0d0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
a0e0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
a0f0: 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65   n<50 ){.    zSe
a100: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
a110: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
a120: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
a130: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
a140: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
a150: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
a160: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
a170: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
a180: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
a190: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
a1a0: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
a1b0: 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  mt==0 ) return 0
a1c0: 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74  ;.  strcpy(zStmt
a1d0: 2c 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26  , !OMIT_TEMPDB&&
a1e0: 69 73 54 65 6d 70 20 3f 20 22 43 52 45 41 54 45  isTemp ? "CREATE
a1f0: 20 54 45 4d 50 20 54 41 42 4c 45 20 22 3a 22 43   TEMP TABLE ":"C
a200: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
a210: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
a220: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
a230: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
a240: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
a250: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
a260: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
a270: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a280: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a290: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
a2a0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
a2b0: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
a2c0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
a2d0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
a2e0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
a2f0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a300: 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e   if( (z = pCol->
a310: 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20  zType)!=0 ){.   
a320: 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20     zStmt[k++] = 
a330: 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70  ' ';.      strcp
a340: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b  y(&zStmt[k], z);
a350: 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  .      k += strl
a360: 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  en(z);.    }.  }
a370: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
a380: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
a390: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
a3a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a3b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
a3c0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
a3d0: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
a3e0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
a3f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a400: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
a410: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
a420: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
a430: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
a440: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
a450: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
a460: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
a470: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
a480: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
a490: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
a4a0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
a4b0: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
a4c0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
a4d0: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
a4e0: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
a4f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
a500: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
a510: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
a520: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
a530: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
a540: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
a550: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
a560: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
a570: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
a580: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
a590: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
a5a0: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
a5b0: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
a5c0: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
a5d0: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
a5e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
a5f0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
a600: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
a610: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
a620: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
a630: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
a640: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
a650: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
a660: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
a670: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
a680: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
a690: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
a6a0: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
a6b0: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
a6c0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
a6d0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
a6e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
a6f0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
a700: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
a710: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
a720: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
a730: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
a740: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a750: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
a760: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
a770: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
a780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a790: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
a7a0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
a7b0: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
a7c0: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
a7d0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c      /* The final
a7e0: 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68   ')' token in th
a7f0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  e CREATE TABLE *
a800: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
a810: 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ect         /* S
a820: 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52  elect from a "CR
a830: 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  EATE ... AS SELE
a840: 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  CT" */.){.  Tabl
a850: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *p;.  sqlite3 
a860: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a870: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
a880: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
a890: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70  pSelect==0) || p
a8a0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
a8b0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
a8c0: 65 64 28 29 20 29 20 7b 0a 20 20 20 20 72 65 74  ed() ) {.    ret
a8d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
a8e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a8f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
a900: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
a910: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
a920: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
a930: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
a940: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
a950: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
a960: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
a970: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
a980: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
a990: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
a9a0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
a9b0: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
a9c0: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
a9d0: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73 53  {.    SrcList sS
a9e0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a9f0: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72        /* Fake Sr
aa00: 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65  cList for pParse
aa10: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
aa20: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
aa30: 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  NC;             
aa40: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
aa50: 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  xt for pParse->p
aa60: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  NewTable */..   
aa70: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
aa80: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
aa90: 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c     memset(&sSrc,
aaa0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29   0, sizeof(sSrc)
aab0: 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72 63  );.    sSrc.nSrc
aac0: 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e 61   = 1;.    sSrc.a
aad0: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a  [0].zName = p->z
aae0: 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61  Name;.    sSrc.a
aaf0: 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20 20  [0].pTab = p;.  
ab00: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72    sSrc.a[0].iCur
ab10: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 4e  sor = -1;.    sN
ab20: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
ab30: 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
ab40: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20  ist = &sSrc;.   
ab50: 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20 31   sNC.isCheck = 1
ab60: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ab70: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
ab80: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65 63  s(&sNC, p->pChec
ab90: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  k) ){.      retu
aba0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rn;.    }.  }.#e
abb0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
abc0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
abd0: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  CK) */..  /* If 
abe0: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
abf0: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
ac00: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
ac10: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
ac20: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
ac30: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
ac40: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
ac50: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
ac60: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
ac70: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
ac80: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
ac90: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
aca0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
acb0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
acc0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
acd0: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
ace0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
acf0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ad00: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
ad10: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
ad20: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
ad30: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
ad40: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
ad50: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
ad60: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
ad70: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
ad80: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
ad90: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
ada0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
adb0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
adc0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
add0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
ade0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20   record number. 
adf0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
ae00: 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75  table entry shou
ae10: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e  ld already be on
ae20: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a   the stack..  **
ae30: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
ae40: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
ae50: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
ae60: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
ae70: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
ae80: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
ae90: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
aea0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
aeb0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
aec0: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
aed0: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
aee0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
aef0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
af00: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
af10: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
af20: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
af30: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
af40: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
af50: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
af60: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
af70: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
af80: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
af90: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
afa0: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
afb0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
afc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
afd0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
afe0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
aff0: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
b000: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b010: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
b020: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
b030: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
b040: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
b050: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
b060: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
b070: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
b080: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
b090: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
b0a0: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
b0b0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
b0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
b0d0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
b0e0: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b0f0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
b100: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
b110: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b120: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
b130: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
b140: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
b150: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
b160: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
b170: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
b180: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
b190: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
b1a0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
b1b0: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
b1c0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
b1d0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
b1e0: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
b1f0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
b200: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
b210: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
b220: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
b230: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
b240: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
b250: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
b260: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
b270: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
b280: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
b290: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
b2a0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
b2b0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
b2c0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
b2d0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
b2e0: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
b2f0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b300: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
b310: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
b320: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
b330: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
b340: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
b350: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
b360: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
b370: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
b380: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
b390: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
b3a0: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
b3b0: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
b3c0: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
b3d0: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
b3e0: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
b3f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
b400: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
b410: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
b420: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
b430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b440: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
b450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b460: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
b470: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  , iDb, 0);.     
b480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b490: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
b4a0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
b4b0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
b4c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
b4d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
b4e0: 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65  elect, SRT_Table
b4f0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 1, 0, 0, 0, 0)
b500: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b510: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
b520: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
b530: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
b540: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
b550: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
b560: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
b570: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
b580: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
b590: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
b5a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
b5b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
b5c0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
b5d0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
b5e0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
b5f0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
b600: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
b610: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
b620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
b630: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
b640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b650: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
b660: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  SelTab);.      }
b670: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
b680: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
b690: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
b6a0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
b6b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
b6c0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ect ){.      zSt
b6d0: 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  mt = createTable
b6e0: 53 74 6d 74 28 70 2c 20 70 2d 3e 70 53 63 68 65  Stmt(p, p->pSche
b6f0: 6d 61 3d 3d 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ma==pParse->db->
b700: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
b710: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b720: 20 20 6e 20 3d 20 70 45 6e 64 2d 3e 7a 20 2d 20    n = pEnd->z - 
b730: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b740: 65 6e 2e 7a 20 2b 20 31 3b 0a 20 20 20 20 20 20  en.z + 1;.      
b750: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
b760: 50 72 69 6e 74 66 28 22 43 52 45 41 54 45 20 25  Printf("CREATE %
b770: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
b780: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
b790: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d  eToken.z);.    }
b7a0: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
b7b0: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
b7c0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b7d0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
b7e0: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
b7f0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
b800: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
b810: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
b820: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
b830: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
b840: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
b850: 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20    The rowid for 
b860: 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  the preallocated
b870: 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20  .    ** slot is 
b880: 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20  the 2nd item on 
b890: 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20  the stack.  The 
b8a0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
b8b0: 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   is the.    ** r
b8c0: 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74 68 65  oot page for the
b8d0: 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61   new table (or a
b8e0: 20 30 20 69 66 20 74 68 69 73 20 69 73 20 61 20   0 if this is a 
b8f0: 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  view)..    */.  
b900: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
b910: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
b920: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
b930: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
b940: 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
b950: 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
b960: 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73  , rootpage=#0, s
b970: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
b980: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c  WHERE rowid=#1",
b990: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
b9a0: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
b9b0: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
b9c0: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
b9d0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
b9e0: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
b9f0: 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
ba00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53 74    sqliteFree(zSt
ba10: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
ba20: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
ba30: 20 76 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   v, iDb);..#ifnd
ba40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ba50: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
ba60: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
ba70: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
ba80: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
ba90: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
baa0: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
bab0: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
bac0: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
bad0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bae0: 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20  >autoInc ){.    
baf0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
bb00: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
bb10: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
bb20: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
bb30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bb40: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
bb50: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
bb60: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
bb70: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
bb80: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
bb90: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
bba0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
bbb0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
bbc0: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
bbd0: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
bbe0: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
bbf0: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
bc00: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
bc10: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
bc20: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
bc30: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
bc40: 65 33 4d 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e  e3MPrintf("tbl_n
bc50: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
bc60: 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
bc70: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
bc80: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
bc90: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
bca0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
bcb0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
bcc0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
bcd0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
bce0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
bcf0: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
bd00: 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20  FKey *pFKey; .  
bd10: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
bd20: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
bd30: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
bd40: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
bd50: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
bd60: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
bd70: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 70 29 3b  (p->zName)+1,p);
bd80: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
bd90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bda0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
bdb0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
bdc0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
bdd0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
bde0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
bdf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
be00: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
be10: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
be20: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
be30: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
be40: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
be50: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
be60: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
be70: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
be80: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48  extTo = sqlite3H
be90: 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61  ashFind(&pSchema
bea0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
beb0: 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20  zTo, nTo);.     
bec0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
bed0: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  rt(&pSchema->aFK
bee0: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
bef0: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
bf00: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
bf10: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
bf20: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61  = 0;.    db->nTa
bf30: 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66  ble++;.    db->f
bf40: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
bf50: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
bf60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bf70: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
bf80: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
bf90: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
bfa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
bfb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
bfc0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
bfd0: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
bfe0: 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
bff0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
c000: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
c010: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
c020: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
c030: 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
c040: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
c050: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
c060: 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
c070: 6d 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  me;.      p->add
c080: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
c090: 20 73 71 6c 69 74 65 33 75 74 66 38 43 68 61 72   sqlite3utf8Char
c0a0: 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
c0b0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
c0c0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
c0d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c0e0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
c0f0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
c100: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
c110: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
c120: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
c130: 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
c140: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c150: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
c160: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
c170: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
c180: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
c190: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
c1a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
c1b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
c1c0: 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
c1d0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
c1e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
c1f0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
c200: 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
c210: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
c220: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
c230: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
c240: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
c250: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
c260: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
c270: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
c280: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
c290: 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a 20  Temp         /* 
c2a0: 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
c2b0: 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a  RARY view */.){.
c2c0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
c2d0: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  t n;.  const uns
c2e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20  igned char *z;. 
c2f0: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
c300: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
c310: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  oken *pName;.  i
c320: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
c330: 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
c340: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c350: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
c360: 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
c370: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
c380: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
c390: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
c3a0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
c3b0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
c3c0: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
c3d0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
c3e0: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 29  2, isTemp, 1, 0)
c3f0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
c400: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
c410: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
c420: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
c430: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
c440: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
c450: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
c460: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
c470: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
c480: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
c490: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
c4a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
c4b0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
c4c0: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c  hema);.  if( sql
c4d0: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
c4e0: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
c4f0: 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20  "view", pName). 
c500: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
c510: 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
c520: 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20  elect).  ){.    
c530: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
c540: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
c550: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
c560: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
c570: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
c580: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
c590: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
c5a0: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
c5b0: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
c5c0: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
c5d0: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
c5e0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
c5f0: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
c600: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
c610: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
c620: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
c630: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
c640: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
c650: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
c660: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
c670: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
c680: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
c690: 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c  e3SelectDup(pSel
c6a0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
c6b0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c6c0: 65 63 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ect);.  if( sqli
c6d0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
c6e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
c6f0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 72  .  }.  if( !pPar
c700: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
c710: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c720: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
c730: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
c740: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
c750: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
c760: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
c770: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
c780: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
c790: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
c7a0: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
c7b0: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
c7c0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
c7d0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
c7e0: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
c7f0: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
c800: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
c810: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
c820: 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74  >z;.  z = (const
c830: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
c840: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
c850: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
c860: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
c870: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
c880: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
c890: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
c8a0: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
c8b0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
c8c0: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
c8d0: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
c8e0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
c8f0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
c900: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
c910: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
c920: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
c930: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c940: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
c950: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
c960: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
c970: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
c980: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
c990: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
c9a0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
c9b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
c9c0: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
c9d0: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
c9e0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
c9f0: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
ca00: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
ca10: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
ca20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
ca30: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
ca40: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
ca50: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
ca60: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
ca70: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
ca80: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
ca90: 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
caa0: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
cab0: 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
cac0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
cad0: 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
cae0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
caf0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
cb00: 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
cb10: 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
cb20: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
cb30: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
cb40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
cb50: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
cb60: 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
cb70: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
cb80: 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20 20 61  assigned */..  a
cb90: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
cba0: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
cbb0: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
cbc0: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
cbd0: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
cbe0: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
cbf0: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
cc00: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
cc10: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
cc20: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
cc30: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
cc40: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
cc50: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
cc60: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
cc70: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
cc80: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
cc90: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
cca0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
ccb0: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
ccc0: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
ccd0: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
cce0: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
ccf0: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
cd00: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
cd10: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
cd20: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
cd30: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
cd40: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
cd50: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
cd60: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
cd70: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
cd80: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
cd90: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
cda0: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
cdb0: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
cdc0: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
cdd0: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
cde0: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
cdf0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
ce00: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
ce10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ce20: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
ce30: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
ce40: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
ce50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
ce60: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
ce70: 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
ce80: 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
ce90: 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
cea0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
ceb0: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
cec0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
ced0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
cee0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
cef0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
cf00: 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
cf10: 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
cf20: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
cf30: 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
cf40: 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
cf50: 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
cf60: 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
cf70: 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
cf80: 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
cf90: 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
cfa0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
cfb0: 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
cfc0: 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
cfd0: 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
cfe0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
cff0: 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
d000: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d010: 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
d020: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
d030: 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
d040: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d050: 44 75 70 28 70 54 61 62 6c 65 2d 3e 70 53 65 6c  Dup(pTable->pSel
d060: 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ect);.  if( pSel
d070: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
d080: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
d090: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
d0a0: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
d0b0: 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
d0c0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
d0d0: 3d 20 2d 31 3b 0a 20 20 20 20 70 53 65 6c 54 61  = -1;.    pSelTa
d0e0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
d0f0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
d100: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
d110: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
d120: 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65  = n;.    if( pSe
d130: 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73  lTab ){.      as
d140: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
d150: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
d160: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
d170: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
d180: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
d190: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
d1a0: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
d1b0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
d1c0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
d1d0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
d1e0: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
d1f0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70  SelTab);.      p
d200: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
d210: 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  flags |= DB_Unre
d220: 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65  setViews;.    }e
d230: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
d240: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
d250: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
d260: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d270: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a  ctDelete(pSel);.
d280: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
d290: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Err++;.  }.  ret
d2a0: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
d2b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d2c0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
d2d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d2e0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
d2f0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
d300: 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
d310: 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
d320: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
d330: 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
d340: 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
d350: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
d360: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
d370: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
d380: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
d390: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
d3a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
d3b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
d3c0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
d3d0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
d3e0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
d3f0: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
d400: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
d410: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
d420: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
d430: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d440: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
d450: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
d460: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
d470: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
d480: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
d490: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
d4a0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
d4b0: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
d4c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
d4d0: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
d4e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d4f0: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
d500: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
d510: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
d520: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
d530: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
d540: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
d550: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
d560: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
d570: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
d580: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
d590: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
d5a0: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
d5b0: 20 69 54 6f 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   iTo..*/.#ifndef
d5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d5d0: 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
d5e0: 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
d5f0: 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  d(Db *pDb, int i
d600: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
d610: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
d620: 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
d630: 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ;..  pHash = &pD
d640: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
d650: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
d660: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
d670: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
d680: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
d690: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
d6a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
d6b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
d6c0: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
d6d0: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
d6e0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
d6f0: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
d700: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d710: 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
d720: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
d730: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
d740: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
d750: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
d760: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
d770: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
d780: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
d790: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
d7a0: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
d7b0: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
d7c0: 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
d7d0: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
d7e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d7f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 30 29  .  }.  assert(0)
d800: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
d810: 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
d820: 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
d830: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
d840: 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
d850: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
d860: 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
d870: 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
d880: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
d890: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
d8a0: 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
d8b0: 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
d8c0: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
d8d0: 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
d8e0: 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
d8f0: 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
d900: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
d910: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
d920: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
d930: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
d940: 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
d950: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
d960: 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
d970: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
d980: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
d990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d9a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
d9b0: 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 69 44 62  roy, iTable, iDb
d9c0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
d9d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
d9e0: 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
d9f0: 79 20 70 75 73 68 65 73 20 61 6e 20 69 6e 74 65  y pushes an inte
da00: 67 65 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ger onto the sta
da10: 63 6b 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  ck. If this inte
da20: 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
da30: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
da40: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
da50: 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
da60: 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
da70: 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
da80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
da90: 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
daa0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
dab0: 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
dac0: 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
dad0: 20 2a 2a 20 54 68 65 20 22 23 30 22 20 69 6e 20   ** The "#0" in 
dae0: 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
daf0: 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
db00: 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
db10: 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
db20: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
db30: 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 73 71  e stack.  See sq
db40: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
db50: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  r()..  */.  sqli
db60: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
db70: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
db80: 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
db90: 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
dba0: 20 23 30 20 41 4e 44 20 72 6f 6f 74 70 61 67 65   #0 AND rootpage
dbb0: 3d 23 30 22 2c 0a 20 20 20 20 20 70 50 61 72 73  =#0",.     pPars
dbc0: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
dbd0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
dbe0: 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65  BLE(iDb), iTable
dbf0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
dc00: 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
dc10: 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
dc20: 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
dc30: 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
dc40: 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
dc50: 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
dc60: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
dc70: 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
dc80: 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
dc90: 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
dca0: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
dcb0: 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
dcc0: 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
dcd0: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
dce0: 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
dcf0: 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
dd00: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
dd10: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
dd20: 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
dd30: 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
dd40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dd50: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
dd60: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
dd70: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
dd80: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
dd90: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
dda0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
ddb0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
ddc0: 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f  chema);.  destro
ddd0: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
dde0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44  , pTab->tnum, iD
ddf0: 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
de00: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
de10: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
de20: 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
de30: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
de40: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
de50: 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
de60: 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
de70: 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
de80: 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
de90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
dea0: 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
deb0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
dec0: 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
ded0: 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
dee0: 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
def0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
df00: 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
df10: 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
df20: 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
df30: 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
df40: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
df50: 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
df60: 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
df70: 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
df80: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
df90: 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
dfa0: 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
dfb0: 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
dfc0: 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
dfd0: 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
dfe0: 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
dff0: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
e000: 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
e010: 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
e020: 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
e030: 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
e040: 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
e050: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
e060: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
e070: 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
e080: 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
e090: 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
e0a0: 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
e0b0: 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
e0c0: 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
e0d0: 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
e0e0: 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
e0f0: 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
e100: 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
e110: 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
e120: 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
e130: 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
e140: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
e150: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
e160: 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
e170: 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
e180: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
e190: 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
e1a0: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
e1b0: 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
e1c0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
e1d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
e1e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e1f0: 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
e200: 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
e210: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
e220: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
e230: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
e240: 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
e250: 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
e260: 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
e270: 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
e280: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
e290: 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
e2a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
e2b0: 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
e2c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
e2d0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
e2e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
e2f0: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
e300: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
e310: 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74  ema);.      dest
e320: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
e330: 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
e340: 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
e350: 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
e360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
e370: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
e380: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e390: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
e3a0: 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
e3b0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
e3c0: 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
e3d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
e3e0: 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
e3f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
e400: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
e410: 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
e420: 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
e430: 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
e440: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
e450: 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
e460: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e470: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
e480: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e490: 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  r || sqlite3Mall
e4a0: 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
e4b0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
e4c0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
e4d0: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
e4e0: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
e4f0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
e500: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
e510: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
e520: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
e530: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
e540: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
e550: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
e560: 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61  sqlite3ErrorClea
e570: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
e580: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
e590: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
e5a0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e5b0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
e5c0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
e5d0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
e5e0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
e5f0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
e600: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
e610: 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
e620: 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
e630: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
e640: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
e650: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
e660: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
e670: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
e680: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
e690: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
e6a0: 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
e6b0: 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
e6c0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e6d0: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
e6e0: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
e6f0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
e700: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
e710: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
e720: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
e730: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
e740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
e750: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
e760: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
e770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e780: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
e790: 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
e7a0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
e7b0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
e7c0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
e7d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
e7e0: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
e7f0: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
e800: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
e810: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
e820: 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
e830: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
e840: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
e850: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
e860: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
e870: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
e880: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
e890: 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
e8a0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
e8b0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
e8c0: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
e8d0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54  .#endif.  if( pT
e8e0: 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  ab->readOnly || 
e8f0: 70 54 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44  pTab==db->aDb[iD
e900: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b].pSchema->pSeq
e910: 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
e920: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e930: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
e940: 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
e950: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
e960: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e970: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
e980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e990: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
e9a0: 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
e9b0: 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
e9c0: 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
e9d0: 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
e9e0: 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
e9f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
ea00: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
ea10: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
ea20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ea30: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
ea40: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
ea50: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
ea60: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
ea70: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
ea80: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
ea90: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
eaa0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
eab0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
eac0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
ead0: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
eae0: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
eaf0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
eb00: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
eb10: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
eb20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
eb30: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
eb40: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
eb50: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
eb60: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
eb70: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
eb80: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
eb90: 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  v ){.    Trigger
eba0: 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20   *pTrigger;.    
ebb0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
ebc0: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c  Db[iDb];.    sql
ebd0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
ebe0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
ebf0: 30 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  0, iDb);..    /*
ec00: 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
ec10: 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
ec20: 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
ec30: 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
ec40: 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  .    ** is gener
ec50: 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
ec60: 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
ec70: 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
ec80: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  .    ** sqlite_t
ec90: 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
eca0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
ecb0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
ecc0: 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20  ab->pTrigger;.  
ecd0: 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
ece0: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
ecf0: 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
ed00: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
ed10: 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
ed20: 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
ed30: 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
ed40: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
ed50: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
ed60: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
ed70: 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20  Trigger);.      
ed80: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
ed90: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
eda0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
edb0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
edc0: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f  MENT.    /* Remo
edd0: 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
ede0: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
edf0: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
ee00: 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20  ciated with.    
ee10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
ee20: 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
ee30: 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
ee40: 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
ee50: 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74  pped.    ** at t
ee60: 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
ee70: 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
ee80: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
ee90: 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  e needs to.    *
eea0: 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
eeb0: 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
eec0: 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
eed0: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
eee0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
eef0: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  pTab->autoInc ){
ef00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
ef10: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
ef20: 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
ef30: 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65  E FROM %s.sqlite
ef40: 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
ef50: 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
ef60: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
ef70: 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  ab->zName.      
ef80: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
ef90: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
efa0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
efb0: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
efc0: 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
efd0: 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  r to the.    ** 
efe0: 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
eff0: 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
f000: 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
f010: 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
f020: 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  es.    ** every 
f030: 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
f040: 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
f050: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
f060: 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20  he one being.   
f070: 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
f080: 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
f090: 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
f0a0: 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
f0b0: 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  an be.    ** cre
f0c0: 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
f0d0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
f0e0: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
f0f0: 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20   in another.    
f100: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
f110: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
f120: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f130: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c  e, .        "DEL
f140: 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
f150: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
f160: 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
f170: 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70  ger'",.        p
f180: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
f190: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
f1a0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
f1b0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
f1c0: 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c       destroyTabl
f1d0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
f1e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
f1f0: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
f200: 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
f210: 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
f220: 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
f230: 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
f240: 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a   cookie..    */.
f250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
f260: 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p3(v, OP_DropTab
f270: 6c 65 2c 20 69 44 62 2c 20 30 2c 20 70 54 61 62  le, iDb, 0, pTab
f280: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
f290: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
f2a0: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
f2b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
f2c0: 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
f2d0: 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
f2e0: 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
f2f0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
f300: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
f310: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f320: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
f330: 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
f340: 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
f350: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
f360: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
f370: 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
f380: 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
f390: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
f3a0: 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
f3b0: 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
f3c0: 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
f3d0: 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
f3e0: 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
f3f0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
f400: 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
f410: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
f420: 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
f430: 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
f440: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
f450: 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
f460: 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
f470: 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
f480: 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
f490: 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
f4a0: 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
f4b0: 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
f4c0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
f4d0: 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
f4e0: 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
f4f0: 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
f500: 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
f510: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
f520: 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
f530: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
f540: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
f550: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
f560: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f570: 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
f580: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
f590: 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65  ld.  The new FKe
f5a0: 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b  y.** is not link
f5b0: 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65  ed into db->aFKe
f5c0: 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  y at this point 
f5d0: 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  - that does not 
f5e0: 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20  happen.** until 
f5f0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
f600: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  )..**.** The for
f610: 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
f620: 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
f630: 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
f640: 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
f650: 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
f660: 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
f670: 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
f680: 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
f690: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
f6a0: 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
f6b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f6c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f6d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
f6e0: 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
f6f0: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
f700: 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
f710: 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
f720: 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
f730: 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
f740: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
f750: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
f760: 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
f770: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
f780: 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
f790: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
f7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
f7b0: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
f7c0: 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
f7d0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f7e0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f7f0: 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
f800: 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
f810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
f820: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
f830: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
f840: 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
f850: 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
f860: 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
f870: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
f880: 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  rr ) goto fk_end
f890: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
f8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
f8b0: 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
f8c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
f8d0: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
f8e0: 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
f8f0: 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
f900: 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
f910: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f920: 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
f930: 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
f940: 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
f950: 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
f960: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
f970: 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
f980: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
f990: 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
f9a0: 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
f9b0: 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
f9c0: 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
f9d0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
f9e0: 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
f9f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
fa00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
fa10: 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
fa20: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
fa30: 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
fa40: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
fa50: 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
fa60: 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
fa70: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
fa80: 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
fa90: 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
faa0: 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
fab0: 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
fac0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
fad0: 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73  *pFKey) + nCol*s
fae0: 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
faf0: 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
fb00: 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
fb10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
fb20: 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
fb30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
fb40: 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54  yte += strlen(pT
fb50: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
fb60: 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
fb70: 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
fb80: 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  eMalloc( nByte )
fb90: 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
fba0: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
fbb0: 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
fbc0: 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
fbd0: 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
fbe0: 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
fbf0: 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b  &pFKey[1];.  pFK
fc00: 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75  ey->aCol = (stru
fc10: 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20  ct sColMap*)z;. 
fc20: 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72   z += sizeof(str
fc30: 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f  uct sColMap)*nCo
fc40: 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  l;.  pFKey->zTo 
fc50: 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
fc60: 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
fc70: 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
fc80: 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  0;.  z += pTo->n
fc90: 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65  +1;.  pFKey->pNe
fca0: 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65  xtTo = 0;.  pFKe
fcb0: 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
fcc0: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
fcd0: 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
fce0: 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
fcf0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
fd00: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
fd10: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
fd20: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
fd30: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
fd40: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
fd50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
fd60: 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
fd70: 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
fd80: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
fd90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
fda0: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
fdb0: 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
fdc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fdd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fde0: 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
fdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
fe00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fe10: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
fe20: 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
fe30: 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
fe40: 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
fe50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
fe60: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
fe70: 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
fe80: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
fe90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fea0: 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
feb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
fec0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
fed0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f  n = strlen(pToCo
fee0: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
fef0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
ff00: 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
ff10: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
ff20: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
ff30: 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
ff40: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
ff50: 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
ff60: 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
ff70: 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
ff80: 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
ff90: 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20  flags & 0xff;.  
ffa0: 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e  pFKey->updateCon
ffb0: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20  f = (flags >> 8 
ffc0: 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65  ) & 0xff;.  pFKe
ffd0: 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20  y->insertConf = 
ffe0: 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26  (flags >> 16 ) &
fff0: 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e   0xff;..  /* Lin
10000 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
10010 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
10020 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
10030 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
10040 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
10050 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
10060 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
10070 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
10080 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10090 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
100a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
100b0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f  rListDelete(pFro
100c0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
100d0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
100e0 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ToCol);.}../*.**
100f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10100 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
10110 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
10120 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59  ATE or INITIALLY
10130 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61   DEFERRED.** cla
10140 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70  use is seen as p
10150 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e  art of a foreign
10160 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e   key definition.
10170 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64    The isDeferred
10180 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
10190 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   1 for INITIALLY
101a0 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20   DEFERRED and 0 
101b0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  for INITIALLY IM
101c0 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20  MEDIATE..** The 
101d0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
101e0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
101f0 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  eated foreign ke
10200 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a  y is adjusted.**
10210 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f   accordingly..*/
10220 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
10230 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72  erForeignKey(Par
10240 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
10250 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66  isDeferred){.#if
10260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10270 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54  _FOREIGN_KEY.  T
10280 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b  able *pTab;.  FK
10290 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28  ey *pFKey;.  if(
102a0 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   (pTab = pParse-
102b0 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c  >pNewTable)==0 |
102c0 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d  | (pFKey = pTab-
102d0 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74  >pFKey)==0 ) ret
102e0 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73  urn;.  pFKey->is
102f0 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66  Deferred = isDef
10300 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
10310 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
10320 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
10330 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
10340 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
10350 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
10360 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
10370 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
10380 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
10390 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
103a0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
103b0 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
103c0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
103d0 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
103e0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
103f0 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
10400 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
10410 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
10420 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65  .  The memory ce
10430 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ll specified by 
10440 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
10450 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
10460 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
10470 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
10480 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
10490 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
104a0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
104b0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
104c0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
104d0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
104e0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
104f0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
10500 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
10510 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
10520 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
10530 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
10540 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
10550 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
10560 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
10570 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
10580 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
10590 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
105a0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
105b0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
105c0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
105d0 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42  nTab;       /* B
105e0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
105f0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
10600 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
10610 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a  ->nTab+1;     /*
10620 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
10630 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
10640 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10670 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
10680 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
106b0 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
106c0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
106d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
106e0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
106f0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
10700 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
10710 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
10720 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
10730 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
10740 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
10750 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10760 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  x(pParse->db, pI
10770 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
10780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10790 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
107a0 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
107b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
107c0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
107d0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
107e0 20 30 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65   0,.      pParse
107f0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
10800 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
10810 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
10820 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
10830 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
10840 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
10850 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
10860 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
10870 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
10880 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
10890 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
108a0 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
108b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
108c0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
108d0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
108e0 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
108f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10900 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
10910 64 2c 20 6d 65 6d 52 6f 6f 74 50 61 67 65 2c 20  d, memRootPage, 
10920 30 29 3b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 30  0);.    tnum = 0
10930 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
10940 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
10950 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  um;.    sqlite3V
10960 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
10970 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
10980 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10990 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
109a0 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
109b0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
109c0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
109d0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
109e0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
109f0 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
10a00 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 28 63 68   iIdx, tnum, (ch
10a10 61 72 20 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45  ar *)pKey, P3_KE
10a20 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
10a30 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
10a40 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
10a50 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
10a60 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
10a70 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10a80 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
10a90 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 73  d, iTab, 0);.  s
10aa0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
10ab0 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
10ac0 2c 20 69 54 61 62 29 3b 0a 20 20 69 66 28 20 70  , iTab);.  if( p
10ad0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
10ae0 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 69  OE_None ){.    i
10af0 6e 74 20 63 75 72 61 64 64 72 20 3d 20 73 71 6c  nt curaddr = sql
10b00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10b10 64 64 72 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  ddr(v);.    int 
10b20 61 64 64 72 32 20 3d 20 63 75 72 61 64 64 72 2b  addr2 = curaddr+
10b30 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  4;.    sqlite3Vd
10b40 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 63 75  beChangeP2(v, cu
10b50 72 61 64 64 72 2d 31 2c 20 61 64 64 72 32 29 3b  raddr-1, addr2);
10b60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10b70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
10b80 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
10b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ba0 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
10bb0 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
10bc0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10bd0 50 5f 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78  P_IsUnique, iIdx
10be0 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 73 71  , addr2);.    sq
10bf0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10c00 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
10c10 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f 41  CONSTRAINT, OE_A
10c20 62 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  bort,.          
10c30 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
10c40 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
10c50 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
10c60 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73 73 65  TATIC);.    asse
10c70 72 74 28 20 61 64 64 72 32 3d 3d 73 71 6c 69 74  rt( addr2==sqlit
10c80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10c90 72 28 76 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  r(v) );.  }.  sq
10ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10cb0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
10cc0 69 49 64 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iIdx, 0);.  sqli
10cd0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10ce0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
10cf0 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
10d00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10d10 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
10d20 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10d30 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 2c 20  OP_Close, iTab, 
10d40 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
10d50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10d60 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a 7d 0a  se, iIdx, 0);.}.
10d70 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
10d80 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
10d90 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
10da0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
10db0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
10dc0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
10dd0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
10de0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
10df0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
10e00 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
10e10 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
10e20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
10e30 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
10e40 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
10e50 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
10e60 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
10e70 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
10e80 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
10e90 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10ea0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
10eb0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
10ec0 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
10ed0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
10ee0 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
10ef0 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
10f00 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
10f10 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
10f20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
10f30 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
10f40 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
10f50 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
10f60 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
10f70 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
10f80 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
10f90 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
10fa0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
10fb0 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
10fc0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
10fd0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10fe0 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
10ff0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
11000 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
11010 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
11020 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
11030 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
11040 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
11050 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
11060 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
11070 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
11080 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
11090 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
110a0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
110b0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
110c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
110d0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
110e0 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
110f0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11100 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
11110 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
11120 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
11130 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
11140 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
11150 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
11160 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
11170 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
11180 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
11190 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
111a0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
111b0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
111c0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
111d0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
111e0 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
111f0 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
11200 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
11210 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11220 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
11230 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
11240 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
11250 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
11260 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
11270 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
11280 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
11290 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
112a0 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
112b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
112c0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
112d0 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
112e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
112f0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
11300 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
11310 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
11320 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
11330 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
11340 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
11350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11360 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
11370 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
11380 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65  int i, j;.  Toke
11390 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20  n nullId;       
113a0 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66   /* Fake token f
113b0 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c  or an empty ID l
113c0 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72  ist */.  DbFixer
113d0 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
113e0 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
113f0 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
11400 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
11410 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
11420 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
11430 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
11440 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
11450 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11460 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
11470 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
11480 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
11490 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
114a0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
114b0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
114c0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
114d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
114e0 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
114f0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
11500 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
11510 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
11520 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
11530 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
11540 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
11550 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
11560 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
11570 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11580 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
11590 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74  nCol;.  int nExt
115a0 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ra = 0;.  char *
115b0 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70  zExtra;..  if( p
115c0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
115d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
115e0 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
115f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11600 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
11610 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
11620 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
11630 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
11640 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
11650 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
11660 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
11670 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
11680 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
11690 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
116a0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
116b0 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
116c0 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
116d0 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
116e0 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
116f0 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
11700 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
11710 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11720 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
11730 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
11740 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
11750 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
11760 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
11770 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
11780 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
11790 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
117a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
117b0 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
117c0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
117d0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
117e0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
117f0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
11800 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
11810 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
11820 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
11830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61  ..    */.    pTa
11840 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
11850 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
11860 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
11870 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
11880 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54  ame2->n==0 && pT
11890 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  ab && pTab->pSch
118a0 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
118b0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
118c0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a   iDb = 1;.    }.
118d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
118e0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
118f0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
11900 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
11910 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
11920 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
11930 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
11940 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
11950 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
11960 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
11970 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
11980 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
11990 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
119a0 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
119b0 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
119c0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
119d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
119e0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
119f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
11a00 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
11a10 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
11a20 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
11a30 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
11a40 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
11a50 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11a60 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
11a70 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d  Db[iDb].pSchema=
11a80 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
11a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
11aa0 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
11ab0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
11ac0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
11ad0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
11ae0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
11af0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
11b00 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11b10 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
11b20 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
11b30 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
11b40 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54  [iDb];..  if( pT
11b50 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
11b60 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
11b70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11b80 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
11b90 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
11ba0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11bb0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
11bc0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
11bd0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
11be0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
11bf0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
11c00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11c10 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
11c20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
11c30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11c40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
11c50 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
11c60 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
11c70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11c80 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
11c90 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
11ca0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11cb0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
11cc0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
11cd0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
11ce0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
11cf0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
11d00 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
11d10 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
11d20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
11d30 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
11d40 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
11d50 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
11d60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11d70 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
11d80 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
11d90 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
11da0 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
11db0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
11dc0 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
11dd0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
11de0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
11df0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
11e00 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
11e10 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
11e20 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
11e30 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
11e40 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
11e50 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
11e60 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
11e70 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
11e80 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
11e90 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
11ea0 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
11eb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
11ec0 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
11ed0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
11ee0 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
11ef0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
11f00 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
11f10 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
11f20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
11f30 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
11f40 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
11f50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
11f60 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
11f70 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
11f80 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
11f90 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
11fa0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11fb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11fc0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
11fd0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
11fe0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
11ff0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
12000 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
12010 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12020 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ex;.      if( sq
12030 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
12040 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
12050 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
12060 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
12070 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
12080 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12090 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
120a0 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
120b0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
120c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
120d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
120e0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
120f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
12100 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
12110 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
12120 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12130 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
12140 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
12150 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
12160 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
12170 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
12180 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
12190 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
121a0 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
121b0 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
121c0 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
121d0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
121e0 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
121f0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
12200 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
12210 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
12220 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
12230 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
12240 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
12250 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
12260 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
12270 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
12280 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
12290 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
122a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
122b0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
122c0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
122d0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
122e0 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
122f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12300 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12310 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
12320 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
12330 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  pDb->zName;.    
12340 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
12350 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
12360 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
12370 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
12380 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12390 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
123a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
123b0 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
123c0 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
123d0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
123e0 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
123f0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
12400 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
12410 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12420 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
12430 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
12440 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
12450 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
12460 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
12470 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
12480 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
12490 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
124a0 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
124b0 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
124c0 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
124d0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
124e0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
124f0 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
12500 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
12510 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
12520 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
12530 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12540 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75  ist==0 ){.    nu
12550 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54  llId.z = (u8*)pT
12560 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
12570 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
12580 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
12590 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  len((char*)nullI
125a0 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
125b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
125c0 74 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e  tAppend(0, 0, &n
125d0 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20  ullId);.    if( 
125e0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
125f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
12600 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  x;.    pList->a[
12610 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73  0].sortOrder = s
12620 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
12630 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
12640 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
12650 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
12660 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
12670 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
12680 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
12690 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
126a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
126b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
126c0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
126d0 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
126e0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
126f0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
12700 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
12710 2b 20 73 74 72 6c 65 6e 28 70 45 78 70 72 2d 3e  + strlen(pExpr->
12720 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
12730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12740 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
12750 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
12760 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
12770 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
12780 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
12790 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
127a0 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ex = sqliteMallo
127b0 63 28 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  c( .      sizeof
127c0 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20  (Index) +       
127d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
127e0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
127f0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
12800 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
12810 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
12820 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  mn   */.      si
12830 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b  zeof(int)*(nCol+
12840 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e  1) +       /* In
12850 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
12860 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
12870 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
12880 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
12890 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
128a0 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
128b0 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
128c0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
128d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d  er */.      nNam
128e0 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
128f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12900 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a  x.zName      */.
12910 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20        nExtra    
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
12940 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a  sequence names *
12950 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  /.  );.  if( sql
12960 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
12970 28 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  () ) goto exit_c
12980 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
12990 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
129a0 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
129b0 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
129c0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
129d0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
129e0 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
129f0 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
12a00 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
12a10 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
12a20 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
12a30 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
12a40 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
12a50 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
12a60 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
12a70 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
12a80 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
12a90 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
12aa0 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
12ab0 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
12ac0 2b 31 5d 29 3b 0a 20 20 73 74 72 63 70 79 28 70  +1]);.  strcpy(p
12ad0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
12ae0 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ame);.  pIndex->
12af0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
12b00 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
12b10 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
12b20 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
12b30 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
12b40 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
12b50 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
12b60 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
12b70 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
12b80 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68  Schema;..  /* Ch
12b90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
12ba0 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
12bb0 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
12bc0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
12bd0 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
12be0 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
12bf0 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
12c00 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
12c10 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
12c20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
12c30 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
12c40 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
12c50 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
12c60 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
12c70 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
12c80 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
12c90 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
12ca0 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
12cb0 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
12cc0 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
12cd0 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
12ce0 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
12cf0 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
12d00 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
12d10 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
12d20 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
12d30 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
12d40 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
12d50 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12d60 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
12d70 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
12d80 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
12d90 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
12da0 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
12db0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
12de0 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 66 6f  uence */..    fo
12df0 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
12e00 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
12e10 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
12e20 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
12e30 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
12e40 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
12e50 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
12e60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12e70 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
12e80 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
12e90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ea0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
12eb0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
12ec0 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
12ed0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
12ee0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  olName);.      g
12ef0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12f00 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12f10 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
12f20 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66  n[i] = j;.    if
12f30 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
12f40 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
12f50 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
12f60 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
12f70 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
12f80 74 72 61 3b 0a 20 20 20 20 20 20 73 74 72 63 70  tra;.      strcp
12f90 79 28 7a 45 78 74 72 61 2c 20 70 4c 69 73 74 49  y(zExtra, pListI
12fa0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
12fb0 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
12fc0 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 74 72 6c   zExtra += (strl
12fd0 65 6e 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a  en(zColl) + 1);.
12fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ff0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
13000 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
13010 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
13020 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  {.        zColl 
13030 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d  = db->pDfltColl-
13040 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  >zName;.      }.
13050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
13060 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
13070 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
13080 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
13090 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  oll, -1) ){.    
130a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
130b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
130c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
130d0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
130e0 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
130f0 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
13100 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
13110 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
13120 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
13130 72 64 65 72 5b 69 5d 20 3d 20 72 65 71 75 65 73  rder[i] = reques
13140 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
13150 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
13160 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
13170 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  ;..  if( pTab==p
13180 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
13190 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
131a0 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
131b0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
131c0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
131d0 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
131e0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
131f0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
13200 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
13210 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
13220 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
13230 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
13240 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
13250 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
13260 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
13270 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
13280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
13290 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
132a0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
132b0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
132c0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
132d0 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
132e0 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
132f0 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
13300 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
13310 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
13320 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
13330 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
13340 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
13350 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
13360 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
13370 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
13380 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
13390 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
133a0 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
133b0 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
133c0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
133d0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
133e0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
133f0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
13400 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
13410 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
13420 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
13430 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
13440 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
13450 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
13460 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
13470 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
13480 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
13490 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
134a0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
134b0 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
134c0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
134d0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
134e0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
134f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
13500 74 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64  t char *z1 = pId
13510 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
13520 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13530 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61   *z2 = pIndex->a
13540 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
13550 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
13560 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
13570 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
13580 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
13590 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
135a0 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  er[k]!=pIndex->a
135b0 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62  SortOrder[k] ) b
135c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
135d0 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
135e0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
135f0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
13600 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
13610 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
13620 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
13630 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
13640 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
13650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
13660 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
13670 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
13680 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
13690 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
136a0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
136b0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
136c0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
136d0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
136e0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
136f0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
13700 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
13710 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
13720 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
13730 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
13740 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
13750 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
13760 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
13770 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
13780 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
13790 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
137a0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
137b0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
137c0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
137d0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
137e0 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
137f0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
13800 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
13810 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
13820 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
13830 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
13840 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
13850 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13860 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13870 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
13880 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
13890 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
138a0 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
138b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
138c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
138d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
138e0 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
138f0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
13900 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
13910 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
13920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
13930 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
13940 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13950 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13960 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
13970 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
13980 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
13990 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
139a0 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
139b0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
139c0 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
139d0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
139e0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
139f0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
13a00 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
13a10 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
13a20 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
13a50 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e  trlen(pIndex->zN
13a60 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b  ame)+1, pIndex);
13a70 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
13a80 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
13a90 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
13aa0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
13ab0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f  iled */.      go
13ac0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13ad0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
13ae0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
13af0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
13b00 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
13b10 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
13b20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
13b30 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
13b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13b50 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
13b60 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
13b70 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
13b80 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
13b90 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
13ba0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
13bb0 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
13bc0 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
13bd0 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
13be0 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
13bf0 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
13c00 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
13c10 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
13c20 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
13c30 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
13c40 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
13c50 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
13c60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
13c70 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
13c80 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
13c90 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
13ca0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
13cb0 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
13cc0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
13cd0 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
13ce0 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
13cf0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
13d00 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
13d10 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
13d20 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
13d30 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
13d40 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
13d50 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
13d60 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
13d70 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
13d80 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
13d90 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
13da0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
13db0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
13dc0 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
13dd0 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
13de0 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
13df0 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
13e00 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
13e10 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
13e20 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
13e30 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
13e40 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62  e if( db->init.b
13e50 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64  usy==0 ){.    Vd
13e60 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
13e70 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
13e80 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
13e90 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 76 20 3d 20  Mem++;..    v = 
13ea0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13eb0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
13ec0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
13ed0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
13ee0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
13ef0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
13f00 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
13f10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
13f20 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
13f30 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
13f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13f50 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
13f60 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
13f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13f80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
13f90 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
13fa0 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
13fb0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
13fc0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
13fd0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
13fe0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
13ff0 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
14000 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
14010 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
14020 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
14030 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
14040 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
14050 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
14060 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
14070 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
14080 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
14090 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
140a0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
140b0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
140c0 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a  .        pEnd->z
140d0 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c   - pName->z + 1,
140e0 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e  .        pName->
140f0 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
14100 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
14110 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
14120 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
14130 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
14140 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
14150 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
14160 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
14170 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
14180 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
14190 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
141a0 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
141b0 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
141c0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
141d0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
141e0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
141f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
14200 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
14210 2c 25 51 2c 25 51 2c 23 30 2c 25 51 29 3b 22 2c  ,%Q,%Q,#0,%Q);",
14220 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
14230 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
14240 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
14250 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
14260 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
14270 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
14280 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
14290 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
142a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
142b0 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   1, 0);.    sqli
142c0 74 65 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a  teFree(zStmt);..
142d0 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
142e0 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
142f0 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
14300 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
14310 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
14320 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
14330 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
14340 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
14350 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
14360 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
14370 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
14380 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
14390 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
143a0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
143b0 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
143c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
143d0 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
143e0 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20  hema, iDb, 0,.  
143f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
14400 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27  rintf("name='%q'
14410 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
14420 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P3_DYNAMIC);.
14430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14440 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 78 70  eAddOp(v, OP_Exp
14450 69 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ire, 0, 0);.    
14460 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
14470 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
14480 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
14490 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
144a0 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
144b0 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
144c0 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
144d0 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
144e0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
144f0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
14500 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
14510 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
14520 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
14530 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20  UPDATE.  ** and 
14540 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69  INSERT..  */.  i
14550 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
14560 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
14570 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
14580 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
14590 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
145a0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
145b0 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
145c0 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
145d0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
145e0 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
145f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
14600 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
14610 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
14620 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
14630 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
14640 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
14650 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
14660 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
14670 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
14680 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
14690 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
146a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
146b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
146c0 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
146d0 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
146e0 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
146f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
14700 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
14710 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
14720 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
14730 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
14740 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
14750 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e     freeIndex(pIn
14760 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  dex);.  }.  sqli
14770 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
14780 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  e(pList);.  sqli
14790 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
147a0 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  (pTblName);.  sq
147b0 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
147c0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
147d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
147e0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
147f0 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e  he file format n
14800 75 6d 62 65 72 20 69 73 20 61 74 20 6c 65 61 73  umber is at leas
14810 74 20 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20  t minFormat..** 
14820 54 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f  The generated co
14830 64 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  de will increase
14840 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
14850 20 6e 75 6d 62 65 72 20 69 66 20 6e 65 63 65 73   number if neces
14860 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sary..*/.void sq
14870 6c 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65  lite3MinimumFile
14880 46 6f 72 6d 61 74 28 50 61 72 73 65 20 2a 70 50  Format(Parse *pP
14890 61 72 73 65 2c 20 69 6e 74 20 69 44 62 2c 20 69  arse, int iDb, i
148a0 6e 74 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20  nt minFormat){. 
148b0 20 56 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20   Vdbe *v;.  v = 
148c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
148d0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
148e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
148f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
14900 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31  adCookie, iDb, 1
14910 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14920 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
14930 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
14940 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14950 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14960 5f 47 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56  _Ge, 0, sqlite3V
14970 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
14980 29 2b 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )+3);.    sqlite
14990 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
149a0 5f 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72  _Integer, minFor
149b0 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mat, 0);.    sql
149c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
149d0 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
149e0 44 62 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Db, 1);.  }.}../
149f0 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
14a00 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
14a10 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
14a20 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
14a30 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
14a40 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
14a50 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
14a60 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
14a70 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
14a80 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
14a90 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
14aa0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
14ab0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
14ac0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
14ad0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
14ae0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
14af0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
14b00 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
14b10 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
14b20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
14b30 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
14b40 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
14b50 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
14b60 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
14b70 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
14b80 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
14b90 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
14ba0 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
14bb0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
14bc0 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66   combiniation of
14bd0 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
14be0 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
14bf0 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
14c00 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
14c10 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
14c20 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
14c30 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
14c40 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
14c50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
14c60 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
14c70 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
14c80 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
14c90 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
14ca0 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
14cb0 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
14cc0 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
14cd0 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
14ce0 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
14cf0 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
14d00 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
14d10 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
14d20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
14d30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
14d40 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
14d50 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
14d60 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d  igned *a = pIdx-
14d70 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74  >aiRowEst;.  int
14d80 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   i;.  assert( a!
14d90 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31  =0 );.  a[0] = 1
14da0 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d  000000;.  for(i=
14db0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
14dc0 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61  >=1; i--){.    a
14dd0 5b 69 5d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  [i] = 10;.  }.  
14de0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
14df0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
14e00 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d    a[pIdx->nColum
14e10 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  n] = 1;.  }.}../
14e20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14e30 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
14e40 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
14e50 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
14e60 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
14e70 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
14e80 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
14e90 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
14ea0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14eb0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
14ec0 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
14ed0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
14ee0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
14ef0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14f00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
14f10 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
14f20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
14f30 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
14f40 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14f50 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
14f60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
14f70 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
14f80 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
14f90 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
14fa0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
14fb0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14fc0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
14fd0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
14fe0 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
14ff0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
15000 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
15010 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
15020 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
15030 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
15040 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15050 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
15060 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
15070 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
15080 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
15090 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
150a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
150b0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
150c0 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
150d0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
150e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
150f0 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
15100 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
15110 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
15120 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
15130 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
15140 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
15150 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15160 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
15170 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
15180 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
15190 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
151a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
151b0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
151c0 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
151d0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
151e0 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
151f0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
15200 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
15210 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
15220 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
15230 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
15240 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
15250 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
15260 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15270 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15280 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
15290 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
152a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
152b0 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
152c0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
152d0 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
152e0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
152f0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
15300 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15310 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
15320 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
15330 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
15340 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
15350 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
15360 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
15370 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
15380 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
15390 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
153a0 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
153b0 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
153c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
153d0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
153e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
153f0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15400 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
15410 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
15420 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
15430 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
15440 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
15450 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
15460 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
15470 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
15480 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
15490 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65   v, iDb);.    de
154a0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
154b0 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
154c0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
154d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
154e0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
154f0 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  b, 0, pIndex->zN
15500 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
15510 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
15520 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
15530 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
15540 0a 2f 2a 0a 2a 2a 20 70 70 41 72 72 61 79 20 70  ./*.** ppArray p
15550 6f 69 6e 74 73 20 69 6e 74 6f 20 61 20 73 74 72  oints into a str
15560 75 63 74 75 72 65 20 77 68 65 72 65 20 74 68 65  ucture where the
15570 72 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 70  re is an array p
15580 6f 69 6e 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  ointer.** follow
15590 65 64 20 62 79 20 74 77 6f 20 69 6e 74 65 67 65  ed by two intege
155a0 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e  rs. The first in
155b0 74 65 67 65 72 20 69 73 20 74 68 65 0a 2a 2a 20  teger is the.** 
155c0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
155d0 74 73 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  ts in the struct
155e0 75 72 65 20 61 72 72 61 79 2e 20 20 54 68 65 20  ure array.  The 
155f0 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 0a 2a  second integer.*
15600 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
15610 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  of allocated slo
15620 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ts in the array.
15630 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
15640 77 6f 72 64 73 2c 20 74 68 65 20 73 74 72 75 63  words, the struc
15650 74 75 72 65 20 6c 6f 6f 6b 73 20 73 6f 6d 65 74  ture looks somet
15660 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
15670 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 72  **.**        str
15680 75 63 74 20 45 78 61 6d 70 6c 65 31 20 7b 0a 2a  uct Example1 {.*
15690 2a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  *          struc
156a0 74 20 73 75 62 45 6c 65 6d 20 2a 61 45 6e 74 72  t subElem *aEntr
156b0 79 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  y;.**          i
156c0 6e 74 20 6e 45 6e 74 72 79 3b 0a 2a 2a 20 20 20  nt nEntry;.**   
156d0 20 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f         int nAllo
156e0 63 3b 0a 2a 2a 20 20 20 20 20 20 20 20 7d 0a 2a  c;.**        }.*
156f0 2a 0a 2a 2a 20 54 68 65 20 70 6e 45 6e 74 72 79  *.** The pnEntry
15700 20 70 61 72 61 6d 65 74 65 72 20 70 6f 69 6e 74   parameter point
15710 73 20 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  s to the equival
15720 65 6e 74 20 6f 66 20 45 78 61 6d 70 6c 65 31 2e  ent of Example1.
15730 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  nEntry..**.** Th
15740 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
15750 61 74 65 73 20 61 20 6e 65 77 20 73 6c 6f 74 20  ates a new slot 
15760 69 6e 20 74 68 65 20 61 72 72 61 79 2c 20 7a 65  in the array, ze
15770 72 6f 73 20 69 74 20 6f 75 74 2c 0a 2a 2a 20 61  ros it out,.** a
15780 6e 64 20 72 65 74 75 72 6e 73 20 69 74 73 20 69  nd returns its i
15790 6e 64 65 78 2e 20 20 49 66 20 6d 61 6c 6c 6f 63  ndex.  If malloc
157a0 20 66 61 69 6c 73 20 61 20 6e 65 67 61 74 69 76   fails a negativ
157b0 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e number is retu
157c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 7a 45 6e  rned..**.** szEn
157d0 74 72 79 20 69 73 20 74 68 65 20 73 69 7a 65 6f  try is the sizeo
157e0 66 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 61 72  f of a single ar
157f0 72 61 79 20 65 6e 74 72 79 2e 20 20 69 6e 69 74  ray entry.  init
15800 53 69 7a 65 20 69 73 20 74 68 65 20 0a 2a 2a 20  Size is the .** 
15810 6e 75 6d 62 65 72 20 6f 66 20 61 72 72 61 79 20  number of array 
15820 65 6e 74 72 69 65 73 20 61 6c 6c 6f 63 61 74 65  entries allocate
15830 64 20 6f 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  d on the initial
15840 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   allocation..*/.
15850 69 6e 74 20 73 71 6c 69 74 65 33 41 72 72 61 79  int sqlite3Array
15860 41 6c 6c 6f 63 61 74 65 28 76 6f 69 64 20 2a 2a  Allocate(void **
15870 70 70 41 72 72 61 79 2c 20 69 6e 74 20 73 7a 45  ppArray, int szE
15880 6e 74 72 79 2c 20 69 6e 74 20 69 6e 69 74 53 69  ntry, int initSi
15890 7a 65 29 7b 0a 20 20 63 68 61 72 20 2a 70 3b 0a  ze){.  char *p;.
158a0 20 20 69 6e 74 20 2a 61 6e 20 3d 20 28 69 6e 74    int *an = (int
158b0 2a 29 26 70 70 41 72 72 61 79 5b 31 5d 3b 0a 20  *)&ppArray[1];. 
158c0 20 69 66 28 20 61 6e 5b 30 5d 3e 3d 61 6e 5b 31   if( an[0]>=an[1
158d0 5d 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ] ){.    void *p
158e0 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77  New;.    int new
158f0 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a  Size;.    newSiz
15900 65 20 3d 20 61 6e 5b 31 5d 2a 32 20 2b 20 69 6e  e = an[1]*2 + in
15910 69 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77  itSize;.    pNew
15920 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
15930 28 2a 70 70 41 72 72 61 79 2c 20 6e 65 77 53 69  (*ppArray, newSi
15940 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  ze*szEntry);.   
15950 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
15960 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
15970 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 5b 31 5d  .    }.    an[1]
15980 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20   = newSize;.    
15990 2a 70 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b  *ppArray = pNew;
159a0 0a 20 20 7d 0a 20 20 70 20 3d 20 2a 70 70 41 72  .  }.  p = *ppAr
159b0 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  ray;.  memset(&p
159c0 5b 61 6e 5b 30 5d 2a 73 7a 45 6e 74 72 79 5d 2c  [an[0]*szEntry],
159d0 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
159e0 72 65 74 75 72 6e 20 61 6e 5b 30 5d 2b 2b 3b 0a  return an[0]++;.
159f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
15a00 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
15a10 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
15a20 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
15a30 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
15a40 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
15a50 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
15a60 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
15a70 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
15a80 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
15a90 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
15aa0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
15ab0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
15ac0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15ad0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
15ae0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
15af0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69  loc( sizeof(IdLi
15b00 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
15b10 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15b20 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
15b30 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
15b40 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61   i = sqlite3Arra
15b50 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a  yAllocate((void*
15b60 2a 29 26 70 4c 69 73 74 2d 3e 61 2c 20 73 69 7a  *)&pList->a, siz
15b70 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
15b80 2c 20 35 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  , 5);.  if( i<0 
15b90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
15ba0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
15bb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
15bc0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
15bd0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
15be0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
15bf0 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
15c00 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
15c10 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
15c20 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
15c30 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
15c40 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
15c50 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
15c60 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
15c70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
15c80 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
15c90 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
15ca0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
15cb0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
15cc0 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
15cd0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
15ce0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
15cf0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
15d00 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
15d10 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
15d20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
15d30 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
15d40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
15d50 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
15d60 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
15d70 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
15d80 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
15d90 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
15da0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
15db0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
15dc0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
15dd0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
15de0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
15df0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
15e00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
15e10 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  1;.}../*.** Appe
15e20 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
15e30 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
15e40 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
15e50 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
15e60 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
15e70 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
15e80 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
15e90 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
15ea0 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
15eb0 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
15ec0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
15ed0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
15ee0 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
15ef0 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
15f00 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
15f10 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
15f20 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
15f30 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
15f40 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
15f50 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
15f60 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
15f70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
15f80 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
15f90 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
15fa0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
15fb0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
15fc0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
15fd0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
15fe0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
15ff0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
16000 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
16010 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
16020 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
16030 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
16040 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
16050 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
16060 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
16070 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
16080 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
16090 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
160a0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
160b0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
160c0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
160d0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
160e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
160f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
16100 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29  istAppend(A,B,0)
16110 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
16120 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
16130 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
16140 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
16150 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
16160 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
16170 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
16180 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
16190 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,C);.**.** T
161a0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
161b0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
161c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
161d0 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
161e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
161f0 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c  pend(SrcList *pL
16200 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  ist, Token *pTab
16210 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  le, Token *pData
16220 62 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20  base){.  struct 
16230 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
16240 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
16250 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
16260 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
16270 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
16280 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
16290 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
162a0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
162b0 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  oc = 1;.  }.  if
162c0 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70  ( pList->nSrc>=p
162d0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
162e0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
162f0 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  w;.    pList->nA
16300 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70  lloc *= 2;.    p
16310 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  New = sqliteReal
16320 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20  loc(pList,.     
16330 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
16340 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73  (*pList) + (pLis
16350 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  t->nAlloc-1)*siz
16360 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
16370 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
16380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
16390 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
163a0 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
163b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
163c0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77      pList = pNew
163d0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
163e0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
163f0 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nSrc];.  memset
16400 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
16410 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
16420 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
16430 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
16440 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
16450 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
16460 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
16470 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54   pTable ){.    T
16480 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
16490 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
164a0 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
164b0 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
164c0 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
164d0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
164e0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
164f0 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
16500 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
16510 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
16520 6e 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  n(pDatabase);.  
16530 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
16540 20 2d 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73   -1;.  pItem->is
16550 50 6f 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20  Populated = 0;. 
16560 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a   pList->nSrc++;.
16570 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
16580 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
16590 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74  cursors to all t
165a0 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
165b0 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
165c0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
165d0 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
165e0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
165f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
16600 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
16610 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
16620 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
16630 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
16640 6c 65 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  led() );.  if( p
16650 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
16660 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
16670 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
16680 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
16690 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
166a0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
166b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
166c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
166d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
166e0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
166f0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
16700 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
16710 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
16720 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
16730 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
16740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16750 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
16760 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
16770 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
16780 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
16790 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
167a0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
167b0 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73  tAddAlias(SrcLis
167c0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
167d0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
167e0 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
167f0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c  nSrc>0 ){.    pL
16800 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
16810 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  rc-1].zAlias = s
16820 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
16830 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ken(pToken);.  }
16840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
16850 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
16860 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
16870 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
16880 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
16890 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
168a0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
168b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
168c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
168d0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
168e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
168f0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
16900 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
16910 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
16920 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
16930 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
16940 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
16950 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
16960 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
16970 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
16980 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c  zAlias);.    sql
16990 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
169a0 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  0, pItem->pTab);
169b0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
169c0 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  ctDelete(pItem->
169d0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
169e0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
169f0 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
16a00 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
16a10 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  lete(pItem->pUsi
16a20 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
16a30 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
16a40 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
16a50 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
16a60 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
16a70 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
16a80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
16a90 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
16aa0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
16ab0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70   int i;..  if( p
16ac0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
16ad0 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
16ae0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
16af0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16b00 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
16b10 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
16b20 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
16b30 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
16b40 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16b50 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
16b60 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
16b70 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
16b80 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16b90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16ba0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
16bb0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
16bc0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
16bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
16be0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
16bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c00 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  p(v, OP_Transact
16c10 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
16c20 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
16c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
16c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16c50 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
16c60 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
16c70 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
16c80 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
16c90 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
16ca0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
16cb0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
16cc0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
16cd0 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30  .  if( pParse==0
16ce0 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e   || (db=pParse->
16cf0 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44  db)==0 || db->aD
16d00 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
16d10 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
16d20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
16d30 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
16d40 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
16d50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
16d60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
16d70 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
16d80 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
16d90 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20   return;..  v = 
16da0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16db0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
16dc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16dd0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
16de0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
16df0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
16e00 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
16e10 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
16e20 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
16e30 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
16e40 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
16e50 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
16e60 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
16e70 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
16e80 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
16e90 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
16ea0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
16eb0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
16ec0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
16ed0 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d() ) return;.  
16ee0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16ef0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16f00 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
16f10 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
16f20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
16f30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16f40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16f50 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
16f60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16f70 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
16f80 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
16f90 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
16fa0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
16fb0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
16fc0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
16fd0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
16fe0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
16ff0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
17000 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
17010 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
17020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
17030 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
17040 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
17050 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17060 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
17070 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
17080 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
17090 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
170a0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
170b0 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
170c0 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
170d0 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
170e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
170f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17100 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17110 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
17120 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
17130 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
17140 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
17150 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
17160 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
17170 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
17180 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
17190 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
171a0 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
171b0 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20  !db->autoCommit 
171c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
171d0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
171e0 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  rans(db->aDb[1].
171f0 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  pBt, 1);.      i
17200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17210 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17220 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17230 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67  se, "unable to g
17240 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  et a write lock 
17250 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  on ".          "
17260 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
17270 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20  tabase file");. 
17280 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
17290 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
172a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
172b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
172c0 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
172d0 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 0a 20 20  Schema );.  }.  
172e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
172f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
17300 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
17310 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
17320 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
17330 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
17340 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
17350 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
17360 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
17370 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
17380 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
17390 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
173a0 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
173b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
173c0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
173d0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
173e0 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
173f0 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
17400 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
17410 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
17420 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
17430 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
17440 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
17450 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
17460 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
17470 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
17480 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
17490 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
174a0 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
174b0 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
174c0 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
174d0 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
174e0 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
174f0 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
17500 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
17510 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
17520 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
17530 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
17540 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
17550 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
17560 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
17570 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
17580 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
17590 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
175a0 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
175b0 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
175c0 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
175d0 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
175e0 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
175f0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
17600 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
17610 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
17620 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
17630 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
17640 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
17650 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
17660 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
17670 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
17680 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
17690 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
176a0 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
176b0 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
176c0 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
176d0 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
176e0 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
176f0 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
17700 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
17710 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
17720 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
17730 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
17740 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
17750 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
17760 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
17770 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
17780 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
17790 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
177a0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
177b0 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
177c0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
177d0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
177e0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
177f0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
17800 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
17810 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
17820 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17830 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
17840 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a  ookieGoto==0 ){.
17850 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
17860 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
17870 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17880 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
17890 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
178a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
178b0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
178c0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
178d0 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
178e0 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
178f0 73 73 65 72 74 28 20 69 44 62 3c 4d 41 58 5f 41  ssert( iDb<MAX_A
17900 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
17910 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
17920 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
17930 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
17940 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
17950 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
17960 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
17970 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
17980 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
17990 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
179a0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
179b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
179c0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
179d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
179e0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
179f0 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20  abase(pParse);. 
17a00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
17a20 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
17a30 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
17a40 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
17a50 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
17a60 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
17a70 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
17a80 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
17a90 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
17aa0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
17ab0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
17ac0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
17ad0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
17ae0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
17af0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
17b00 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
17b10 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
17b20 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
17b30 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
17b40 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
17b50 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
17b60 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
17b70 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
17b80 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
17b90 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
17ba0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
17bb0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
17bc0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
17bd0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
17be0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
17bf0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
17c00 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
17c10 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
17c20 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
17c30 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
17c40 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
17c50 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
17c60 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
17c70 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
17c80 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
17c90 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
17ca0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
17cb0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a  not be set..**.*
17cc0 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  * Only database 
17cd0 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d 70  iDb and the temp
17ce0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
17cf0 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20 74  de writable by t
17d00 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20  his call..** If 
17d10 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  iDb==0, then the
17d20 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20 64   main and temp d
17d30 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61 64  atabases are mad
17d40 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49 66  e writable.   If
17d50 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e 20  .** iDb==1 then 
17d60 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64 61  only the temp da
17d70 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20 77  tabase is made w
17d80 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44 62  ritable.  If iDb
17d90 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73  >1 then the.** s
17da0 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69 61  pecified auxilia
17db0 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ry database and 
17dc0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
17dd0 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
17de0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
17df0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
17e00 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
17e10 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
17e20 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
17e30 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
17e40 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
17e50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
17e60 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
17e70 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
17e80 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
17e90 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77 72  b);.  pParse->wr
17ea0 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
17eb0 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61 74  b;.  if( setStat
17ec0 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65 2d  ement && pParse-
17ed0 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
17ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17ef0 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
17f00 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
17f10 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d  .  if( (OMIT_TEM
17f20 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26  PDB || iDb!=1) &
17f30 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
17f40 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
17f50 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17f60 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17f70 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
17f80 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
17f90 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
17fa0 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
17fb0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
17fc0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
17fd0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
17fe0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
17ff0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
18000 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
18010 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
18020 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
18030 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
18040 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
18050 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
18060 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
18070 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
18080 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
18090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
180a0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
180b0 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a  i];.    if( z==z
180c0 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43  Coll || (z && zC
180d0 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  oll && 0==sqlite
180e0 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
180f0 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  l)) ){.      ret
18100 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
18110 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
18120 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
18130 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
18140 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
18150 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
18160 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
18170 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
18180 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
18190 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
181a0 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
181b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
181c0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
181d0 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
181e0 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
181f0 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
18200 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
18210 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
18220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
18230 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
18240 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
18250 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
18260 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
18270 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
18280 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
18290 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
182a0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
182b0 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
182c0 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
182d0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
182e0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
182f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
18300 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
18310 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
18320 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
18330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
18340 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
18350 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
18360 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
18370 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
18380 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
18390 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
183a0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
183b0 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
183c0 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
183d0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
183e0 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
183f0 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
18400 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
18410 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
18420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18430 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
18440 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
18450 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
18460 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
18470 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
18480 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
18490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
184a0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
184b0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
184e0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
184f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
18500 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
18510 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
18520 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
18530 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
18540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
18550 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
18560 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
18570 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18590 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
185a0 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f  atabase */..  fo
185b0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
185c0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
185d0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
185e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
185f0 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
18600 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
18610 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
18620 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
18630 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
18640 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
18650 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
18660 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
18670 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
18680 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
18690 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
186a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
186b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
186c0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
186d0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
186e0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
18710 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
18720 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
18730 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
18740 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
18750 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
18760 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
18770 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
18780 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
18790 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
187a0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
187b0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
187c0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
187d0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
187e0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
187f0 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
18800 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
18810 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
18820 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
18830 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
18840 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
18850 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
18860 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
18870 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
18880 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
18890 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
188a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
188b0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
188c0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
188d0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
188e0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
188f0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
18900 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
18910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18920 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
18930 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
18940 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
18950 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18970 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
18980 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
18990 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
189a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
189b0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
189c0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
189d0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
189e0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
189f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
18a00 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
18a10 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
18a20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
18a30 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
18a40 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
18a70 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
18a80 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
18a90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
18aa0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
18ab0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
18ac0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18ae0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
18af0 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
18b00 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
18b10 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
18b20 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
18b30 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
18b40 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
18b50 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
18b60 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
18b70 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
18b80 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
18b90 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
18ba0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
18bb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
18bc0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
18bd0 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d  =0 || pName1->z=
18be0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
18bf0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
18c00 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
18c10 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
18c20 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name2==0 || pNam
18c30 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
18c40 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
18c50 7a 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  z );.    pColl =
18c60 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
18c70 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
18c80 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 31 2d 3e   (char*)pName1->
18c90 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20 30 29  z, pName1->n, 0)
18ca0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
18cb0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
18cc0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  Coll = sqliteStr
18cd0 4e 44 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72  NDup((const char
18ce0 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20 70 4e   *)pName1->z, pN
18cf0 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  ame1->n);.      
18d00 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( zColl ){.   
18d10 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
18d20 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
18d30 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  oll);.        sq
18d40 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 6c 29 3b  liteFree(zColl);
18d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18d60 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
18d70 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
18d80 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
18d90 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
18da0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
18db0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
18dc0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
18dd0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
18de0 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 7a 44  (pObjName);.  zD
18df0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
18e00 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
18e10 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
18e20 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
18e30 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
18e40 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
18e50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
18e60 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
18e70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
18e80 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
18e90 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
18ea0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
18eb0 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 69  liteFree(z);.  i
18ec0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
18ed0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
18ee0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
18ef0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
18f00 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
18f10 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
18f20 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
18f30 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
18f40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18f50 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
18f60 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
18f70 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
18f80 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
18f90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
18fa0 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
18fb0 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
18fc0 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
18fd0 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
18fe0 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
18ff0 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
19000 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
19010 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
19020 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
19030 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
19040 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
19050 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
19060 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
19070 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
19080 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
19090 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e 20 74  qliteFree() on t
190a0 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
190b0 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
190c0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
190d0 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
190e0 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
190f0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
19100 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
19110 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
19120 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
19130 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
19140 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
19150 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
19160 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
19170 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
19180 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
19190 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
191a0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
191b0 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
191c0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f  (KeyInfo) + (nCo
191d0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  l-1)*sizeof(Coll
191e0 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20  Seq*) + nCol;.  
191f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
19200 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74  (KeyInfo *)sqlit
19210 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b  eMalloc(nBytes);
19220 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
19230 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
19240 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70  rder = (u8 *)&(p
19250 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d  Key->aColl[nCol]
19260 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  );.    assert( &
19270 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
19280 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a  [nCol]==&(((u8 *
19290 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20  )pKey)[nBytes]) 
192a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
192b0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
192c0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
192d0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
192e0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
192f0 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20   zColl );.      
19300 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
19310 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
19320 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
19330 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  oll, -1);.      
19340 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
19350 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
19360 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
19370 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
19380 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20  d = nCol;.  }.. 
19390 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
193a0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  r ){.    sqliteF
193b0 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 70  ree(pKey);.    p
193c0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
193d0 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a        eturn pKey;.}.