/ Hex Artifact Content
Login

Artifact 12ad19cfe14c55b24d3f9738edb368edde497475:


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 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  0;.    sqlite3Oo
0a30: 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 76 65 6c  mFault(pToplevel
0a40: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->db);.  }.}../*
0a50: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0a60: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0a70: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0a80: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
0a90: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
0aa0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
0ab0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
0ac0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
0ad0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
0ae0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0af0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0b00: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0b10: 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73 71  ; ..  pVdbe = sq
0b20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0b30: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
0b40: 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20 73  pVdbe!=0 ); /* s
0b50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63 61  qlite3GetVdbe ca
0b60: 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45 20  nnot fail: VDBE 
0b70: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0b80: 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
0b90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ba0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0bb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0bc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0bd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0be0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0c00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0c10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0c20: 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c  Tab, p->isWriteL
0c30: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
0c40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
0c50: 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ame, P4_STATIC);
0c60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
0c70: 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65  define codeTable
0c80: 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a  Locks(x).#endif.
0c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ca0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
0cb0: 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20 69  yDbMask object i
0cc0: 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74 20  s empty - if it 
0cd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31  contains no.** 1
0ce0: 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75   bits.  This rou
0cf0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79 20  tine is used by 
0d00: 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  the DbMaskAllZer
0d10: 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e 6f  o() and DbMaskNo
0d20: 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f  tZero().** macro
0d30: 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 41  s when SQLITE_MA
0d40: 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67 72  X_ATTACHED is gr
0d50: 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a 2a  eater than 30..*
0d60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
0d70: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e 74  _ATTACHED>30.int
0d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41 6c   sqlite3DbMaskAl
0d90: 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d 29  lZero(yDbMask m)
0da0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0db0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 79  (i=0; i<sizeof(y
0dc0: 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69 66  DbMask); i++) if
0dd0: 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( m[i] ) return 
0de0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
0df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0e10: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0e20: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0e30: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e40: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0e60: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e70: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e80: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e90: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0ea0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0eb0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0ec0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0ed0: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0ee0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0ef0: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0f00: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0f10: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0f20: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0f30: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0f40: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0f50: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f70: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f80: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0fa0: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0fb0: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0fe0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1010: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1020: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1030: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
1040: 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  K ) pParse->rc =
1050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1070: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
1080: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
1090: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
10a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
10c0: 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  am.  */.  v = sq
10d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10f0: 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  !pParse->isMulti
1100: 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c 7c  Write .       ||
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
1120: 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70 50  rtMayAbort(v, pP
1130: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 29  arse->mayAbort))
1140: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1150: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 56   while( sqlite3V
1160: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
1170: 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  code(v, OP_Close
1180: 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ) ){}.    sqlite
1190: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a0: 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51  P_Halt);..#if SQ
11b0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
11c0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28  TICATION.    if(
11d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c   pParse->nTableL
11e0: 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69  ock>0 && db->ini
11f0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
1200: 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41 75     sqlite3UserAu
1210: 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  thInit(db);.    
1220: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
1230: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
1240: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ser ){.        p
1250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1260: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1290: 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69  ser not authenti
12a0: 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  cated");.       
12b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
12c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
12e0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
12f0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
1310: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1320: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1330: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1340: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1350: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1360: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1370: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1380: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1390: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
13a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13b0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
13c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
13d0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
13e0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
13f0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1400: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1420: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
1430: 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72  && (DbMaskNonZer
1440: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1450: 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d  Mask) || pParse-
1460: 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20  >pConstExpr).   
1470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1480: 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  b, i;.      asse
1490: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  rt( sqlite3VdbeG
14a0: 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f  etOp(v, 0)->opco
14b0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
14c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a  JumpHere(v, 0);.
14e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b        for(iDb=0;
14f0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1500: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
1510: 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61  ( DbMaskTest(pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  rse->cookieMask,
1530: 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69   iDb)==0 ) conti
1540: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1550: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1560: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
1570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1580: 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20  dOp4Int(v,.     
1590: 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74       OP_Transact
15a0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
15c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
1600: 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28       DbMaskTest(
1610: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1620: 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f  k,iDb), /* P2 */
1630: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1640: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1650: 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Db],          /*
1660: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P3 */.         
1670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1680: 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69  chema->iGenerati
1690: 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20  on  /* P4 */.   
16a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16c0: 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  y==0 ) sqlite3Vd
16d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
16e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16f0: 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20  mment((v,.      
1700: 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d          "usesStm
1710: 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50  tJournal=%d", pP
1720: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26  arse->mayAbort &
1730: 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  & pParse->isMult
1740: 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20  iWrite));.      
1750: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1770: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1780: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1790: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
17a0: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
17b0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17c0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
17d0: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
17e0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
17f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1800: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1810: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1820: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
1830: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
1840: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
1850: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1860: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1870: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1880: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1890: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
18a0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
18b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
18c0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
18d0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
18e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
18f0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1900: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1920: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1930: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1940: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1960: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1970: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1990: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
19a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
19b0: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
19c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
19d0: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
19e0: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
19f0: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a00: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1a10: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1a20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1a30: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1a40: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1a50: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1a70: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ab0: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1ac0: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1ad0: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1af0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b00: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1b10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b20: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1b30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1b40: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
1b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
1b60: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1b70: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1b80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1b90: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1ba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
1bb0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1bc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1bd0: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1be0: 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  evel==0 );  /* D
1bf0: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1c00: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1c10: 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d      /* A minimum
1c20: 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69   of one cursor i
1c30: 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75  s required if au
1c40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  toincrement is u
1c50: 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74  sed.    *  See t
1c60: 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31  icket [a696379c1
1c70: 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69  f08866] */.    i
1c80: 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63  f( pParse->pAinc
1c90: 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  !=0 && pParse->n
1ca0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
1cb0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73  >nTab = 1;.    s
1cc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1cd0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a  ady(v, pParse);.
1ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1d10: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1d20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1d30: 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  We are done with
1d40: 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a 65   this Parse obje
1d50: 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ct. There is no 
1d60: 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74 69  need to de-initi
1d70: 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66 20  alize it */.#if 
1d80: 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  0.  pParse->colN
1d90: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 70  amesSet = 0;.  p
1da0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1dd0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1de0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44  e->nVar = 0;.  D
1df0: 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73 65  bMaskZero(pParse
1e00: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 23  ->cookieMask);.#
1e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1e20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1e30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1e40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1e50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1e60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1e70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1e80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1e90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1ea0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1eb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ec0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ed0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ee0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1ef0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1f00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1f10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1f20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1f30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1f40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1f50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1f60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1f70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1f80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1f90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1fa0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1fb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1fc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1fd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1fe0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1ff0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2000: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
2010: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
2020: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
2030: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
2040: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2050: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
2060: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
2070: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2080: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
20c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20d0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
20e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
2100: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
2110: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
2120: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
2130: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
2140: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
2150: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
2170: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
2180: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
2190: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
21a0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
21c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
21d0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
21e0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
21f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2200: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2210: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2220: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2230: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2240: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2250: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
2260: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
2270: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
2280: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
2290: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
22a0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
22b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
22c0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
22d0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
22e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
2300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2310: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
2320: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
2330: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
2340: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
2350: 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ed--;.}..#if SQL
2360: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2370: 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65  ICATION./*.** Re
2380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61  turn TRUE if zTa
2390: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
23a0: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61  of the system ta
23b0: 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
23c0: 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75  the.** list of u
23d0: 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61  sers and their a
23e0: 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c  ccess credential
23f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2400: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63  3UserAuthTable(c
2410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2420: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2430: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61  ite3_stricmp(zTa
2440: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65  ble, "sqlite_use
2450: 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  r")==0;.}.#endif
2460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2470: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2480: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2490: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
24a0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
24b0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
24c0: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
24d0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
24e0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
24f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2500: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2510: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2520: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2530: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
2540: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
2550: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
2560: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
2570: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2580: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2590: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
25b0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
25c0: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
25d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
25e0: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
25f0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2600: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2610: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2620: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
2630: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2660: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
2670: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2690: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
26a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
26b0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
26c0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
26d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ..  /* All mutex
26e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
26f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
2700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
2710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
2720: 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62 61   assert( zDataba
2730: 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se!=0 || sqlite3
2740: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2750: 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66 20  exes(db) );.#if 
2760: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2770: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20  ENTICATION.  /* 
2780: 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20 75  Only the admin u
2790: 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ser is allowed t
27a0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
27b0: 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62 6c  sqlite_user tabl
27c0: 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f  e.  ** exists */
27d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e  .  if( db->auth.
27e0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
27f0: 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65 33  Admin && sqlite3
2800: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a 4e  UserAuthTable(zN
2810: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ame)!=0 ){.    r
2820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
2830: 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54  dif.  for(i=OMIT
2840: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2850: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2860: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2870: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
2880: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2890: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
28a0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
28b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
28c0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2900: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2910: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2930: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2940: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2950: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2970: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2980: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2990: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29b0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29c0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29d0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
29e0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
29f0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a00: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a10: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a40: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2a50: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2a60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a80: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2a90: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2ab0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2ac0: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2ad0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2ae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2af0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b00: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2b10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2b20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2b30: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2b40: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2b50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b60: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2b70: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2b80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2b90: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2ba0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2bb0: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2bc0: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2bf0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2c00: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2c10: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2c20: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2c30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c40: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2c60: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2c70: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2c80: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2c90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2ca0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2cb0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2cc0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2cd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2ce0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2cf0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2d00: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2d30: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2d40: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2d50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d70: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2d80: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2d90: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2da0: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2db0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73  LTABLE.    if( s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
2de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62  (pParse->db, zDb
2df0: 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20  ase)<1 ){.      
2e00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74  /* If zName is t
2e10: 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  he not the name 
2e20: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
2e30: 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 64  e schema created
2e40: 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   using.      ** 
2e50: 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65  CREATE, then che
2e60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2e70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e80: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  n virtual table 
2e90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61  that.      ** ca
2ea0: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65   */.      Module
2ed0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2ee0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2ef0: 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  d(&pParse->db->a
2f00: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
2f10: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26        if( pMod &
2f20: 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f  & sqlite3VtabEpo
2f30: 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28  nymousTableInit(
2f40: 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b  pParse, pMod) ){
2f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f60: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f80: 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61  dif.    if( zDba
2f90: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
2fa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fb0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
2fc0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
2fd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3000: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3020: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3030: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 0a  chema = 1;.  }..
3040: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3050: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3060: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3070: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3080: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3090: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
30b0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30c0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
30d0: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
30e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30f0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3100: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3110: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3120: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3130: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3140: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3150: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3160: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3170: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3180: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3190: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
31a0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
31b0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
31c0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
31d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
31e0: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
31f0: 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73 56  arse, .  int isV
3200: 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20 53  iew, .  struct S
3210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3220: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3230: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3240: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3250: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3260: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3270: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3290: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
32a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
32b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
32c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
32d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ].zName;.  }else
32e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a  {.    zDb = p->z
32f0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20  Database;.  }.  
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
3320: 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61  , isView, p->zNa
3330: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3340: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3350: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3360: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3370: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3380: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
33a0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
33b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
33d0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
33e0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
33f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3400: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3410: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3420: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3430: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3450: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3460: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3470: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3480: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3490: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
34a0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
34b0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
34c0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
34d0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
34e0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
34f0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3500: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3510: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3520: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3530: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3540: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3550: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3560: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3570: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3580: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3590: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
35a0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
35b0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
35c0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
35d0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
35e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
35f0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3600: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3620: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3630: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3640: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3650: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3660: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3670: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3680: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3690: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
36a0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
36b0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
36c0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
36d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
36f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3700: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
3710: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
3720: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
3730: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
3740: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3770: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
3780: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
3790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
37a0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
37b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
37c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
37e0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
37f0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3820: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3840: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
3850: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
3860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3870: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3880: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3890: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
38a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
38b0: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
38c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
38d0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
38f0: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3920: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
3930: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
3940: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
3950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3960: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3970: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3980: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3990: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
39a0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
39b0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
39c0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
39d0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39e0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
39f0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3a00: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3a10: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3a20: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
3a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
3a40: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
3a50: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3a60: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3a70: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3a80: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3a90: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3aa0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3ab0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3ac0: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3b00: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3b10: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3b20: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3b30: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3b40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3b50: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3b60: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3b70: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3b80: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3b90: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3ba0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3bb0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3bc0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3bd0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3be0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3c00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3c10: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3c20: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3c30: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3c40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3c50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3c60: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3c70: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3c80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3ca0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3ce0: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3cf0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3d10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3d20: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3d30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3d40: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3d50: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3d60: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3d70: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3d80: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3d90: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3da0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3db0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3dc0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3dd0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3de0: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3df0: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3e00: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3e10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3e30: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3e40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3e50: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3e70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3e80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3e90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ec0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3ed0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3ee0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3f00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3f10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3f20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3f30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
3f40: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3f50: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3f60: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3f70: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f80: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f90: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3fa0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3fc0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3fd0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3fe0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4000: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4010: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4020: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
4030: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
4040: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4060: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4070: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4080: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4090: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
40a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
40b0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
40c0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
40d0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
40e0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
40f0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4100: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4110: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
4130: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
4170: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4180: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4190: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
41a0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
41b0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
41c0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
41d0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
41e0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
41f0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4200: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4210: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
4220: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4230: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
4240: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4250: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
4260: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4270: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4280: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4290: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
42a0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
42b0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
42c0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
42d0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
42e0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
42f0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4300: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4310: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4320: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4330: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4340: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4350: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4360: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4370: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4380: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4390: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
43a0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
43b0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
43c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43d0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4410: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4420: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4440: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4450: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4460: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
44a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
44b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
44c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
44d0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
44e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
44f0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4500: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4510: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
4530: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
4540: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
4550: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
4560: 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  y)..*/.void sqli
4570: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4580: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4590: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
45b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
45c0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
45d0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
45e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
45f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4600: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
4610: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4630: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4640: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
4690: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
46a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
46b0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
46c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
46d0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
46e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
46f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4700: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
4710: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
4720: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
4730: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
4740: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4750: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
4760: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
4770: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
4780: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
4790: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
47a0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
47b0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
47c0: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
47d0: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
47e0: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
47f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4800: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
4810: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
4820: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20  e..**.** The db 
4830: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74  parameter is opt
4840: 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65  ional.  It is ne
4850: 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c  eded if the Tabl
4860: 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e  e object .** con
4870: 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20  tains lookaside 
4880: 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20  memory.  (Table 
4890: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
48a0: 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65  chema do not use
48b0: 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  .** lookaside me
48c0: 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65  mory, but some e
48d0: 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
48e0: 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20  bjects do.)  Or 
48f0: 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65  the.** db parame
4900: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
4910: 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73  with db->pnBytes
4920: 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65  Freed to measure
4930: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   the memory.** u
4940: 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65  sed by the Table
4950: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
4960: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4970: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
4980: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
4990: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
49a0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
49b0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
49c0: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
49d0: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
49e0: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
49f0: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73   schema */..  as
4a00: 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c 7c  sert( !pTable ||
4a10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
4a20: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
4a30: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
4a40: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
4a50: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
4a60: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
4a70: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
4a80: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
4a90: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4aa0: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
4ab0: 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29  able->nRef)>0) )
4ac0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52   return;..  /* R
4ad0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ae0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4af0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4b00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4b10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4b20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4b30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4b40: 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20  .  Since schema 
4b50: 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73  Tables do not us
4b60: 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  e.  ** lookaside
4b70: 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68  , this number sh
4b80: 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e  ould not change.
4b90: 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   */.  TESTONLY( 
4ba0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64 62  nLookaside = (db
4bb0: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
4bc0: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
4bd0: 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20  eral)==0) ?.    
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4c00: 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a  de.nOut : 0 );..
4c10: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4c20: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4c30: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4c40: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4c50: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4c60: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4c70: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4c80: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4c90: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4ca0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4cb0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4cc0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4cd0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4ce0: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4cf0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4d00: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4d10: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4d20: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4d30: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4d40: 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26  sert(.         &
4d50: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
4d60: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
4d70: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
4d80: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20    assert( db==0 
4d90: 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  || sqlite3Schema
4da0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
4db0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4dc0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
4dd0: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
4de0: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
4df0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
4e00: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4e10: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4e20: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4e30: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4e40: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4e50: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4e60: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4e70: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4e90: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4ea0: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
4eb0: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
4ec0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4ed0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
4ee0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
4ef0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4f00: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
4f10: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4f20: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
4f30: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
4f40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
4f50: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
4f60: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
4f70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4f80: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
4f90: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
4fa0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
4fb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fc0: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
4fd0: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
4fe0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
4ff0: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5000: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5010: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5020: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5030: 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  e==db->lookaside
5040: 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .nOut );.}../*.*
5050: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5060: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5070: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5080: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5090: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
50a0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
50b0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
50c0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
50d0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
50e0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
50f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5100: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5110: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5120: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5130: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5140: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5150: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5160: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5170: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5190: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
51a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
51b0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
51c0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
51d0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
51e0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
51f0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5200: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5210: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5220: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5230: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5240: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5250: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5260: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5270: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5280: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5290: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
52a0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
52b0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
52c0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
52d0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
52e0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
52f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5300: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5310: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5320: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
5330: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
5340: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5350: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
5360: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
5370: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
5380: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5390: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
53a0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
53b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
53c0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
53d0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
53e0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
53f0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5400: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5410: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5420: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5430: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
5440: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
5450: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5460: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
5470: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
5480: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5490: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
54a0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
54b0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
54c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
54d0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
54e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
54f0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5500: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5510: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5520: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5530: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
5540: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
5560: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
5570: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5580: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
5590: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
55a0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
55b0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
55c0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
55d0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
55e0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
55f0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5600: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5610: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5620: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5630: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
5640: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
5650: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
5660: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
5680: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
5690: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
56a0: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
56b0: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
56c0: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
56d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
56e0: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
56f0: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5700: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5720: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5730: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
5740: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5750: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5760: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
5770: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5780: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5790: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
57a0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
57b0: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
57c0: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
57d0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
57e0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
57f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5800: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5810: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5820: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5830: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
5840: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
5850: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72  Db *pDb;.    for
5860: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
5870: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
5880: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5890: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  -){.      if( 0=
58a0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
58b0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
58c0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
58d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
58e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
58f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
5900: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
5910: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
5920: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
5930: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5940: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5950: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
5960: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
5970: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
5980: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5990: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
59a0: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
59b0: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
59c0: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
59d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
59e0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
59f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
5a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
5a30: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
5a40: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a60: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
5a70: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
5a80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5a90: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5aa0: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5ab0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5ac0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5ad0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5ae0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5af0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5b00: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5b10: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5b20: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5b30: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5b40: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5b50: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5b60: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5b70: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5b80: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
5b90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5ba0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5bb0: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5bc0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5bd0: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5be0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5bf0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
5c00: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
5c10: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5c20: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
5c30: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5c40: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
5c50: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5c60: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5c70: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
5c80: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5c90: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5ca0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5cb0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5cc0: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5cd0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5ce0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5cf0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
5d00: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
5d10: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
5d20: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
5d30: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
5d40: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
5d50: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5d60: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5d70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5d80: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5d90: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5da0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5db0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5dc0: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5dd0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5de0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5df0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5e00: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5e10: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5e20: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5e30: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5e40: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5e50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5e70: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
5e80: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
5e90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5ea0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
5eb0: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
5ec0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e  .  if( pName2->n
5ed0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
5ee0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
5ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
5f10: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
5f20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5f30: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
5f40: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
5f50: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
5f60: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
5f70: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
5f80: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
5f90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5fa0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5fb0: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5fc0: 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e1);.      retur
5fd0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
5fe0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ff0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
6000: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
6010: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
6020: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6030: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6040: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
6050: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
6060: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6070: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6080: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6090: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
60a0: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
60b0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
60c0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
60d0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
60e0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
60f0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
6100: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
6110: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
6120: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6130: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6140: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6150: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6160: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6170: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6180: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6190: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
61a0: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
61b0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
61c0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
61d0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
61e0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
61f0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
6200: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
6210: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
6220: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
6230: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
6240: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
6250: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
6260: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
6270: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
6280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6290: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
62a0: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
62b0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
62c0: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
62d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
62e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
62f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6310: 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  n the PRIMARY KE
6320: 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  Y index of a tab
6330: 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  le.*/.Index *sql
6340: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
6350: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dex(Table *pTab)
6360: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20  {.  Index *p;.  
6370: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64  for(p=pTab->pInd
6380: 65 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d  ex; p && !IsPrim
6390: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20  aryKeyIndex(p); 
63a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
63b0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
63c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
63d0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
63e0: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
63f0: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
6400: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
6410: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
6420: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
6430: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
6440: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
6450: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
6460: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
6470: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
6480: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
6490: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
64a0: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
64b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
64c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
64d0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
64e0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
64f0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
6500: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
6510: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
6520: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
6530: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
6540: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
6550: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
6560: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6570: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
6580: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6590: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
65a0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
65b0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
65c0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
65d0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
65e0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
65f0: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6600: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6610: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6620: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
6630: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
6640: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6650: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
6660: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
6670: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
6680: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6690: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
66a0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
66b0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
66c0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
66d0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
66e0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
66f0: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6700: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6710: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6720: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6730: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
6740: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
6750: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
6760: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
6770: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
6780: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6790: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
67a0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
67b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
67c0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
67d0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
67e0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
67f0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6800: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6810: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6820: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
6830: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
6840: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6850: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
6860: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6870: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
6880: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6890: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
68a0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
68b0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
68c0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
68d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
68e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68f0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6900: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6910: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6920: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
6930: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
6940: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6950: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
6960: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
6970: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6980: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6990: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
69a0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
69b0: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
69c0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
69d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
69e0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
69f0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
6a00: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6a10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6a20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6a30: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
6a40: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
6a50: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
6a60: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
6a70: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
6a80: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
6a90: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
6aa0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6ab0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69  o create */..  i
6ac0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
6ad0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
6ae0: 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  Tnum==1 ){.    /
6af0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
6b00: 20 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c   Parsing the sql
6b10: 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71  ite_master or sq
6b20: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
6b30: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
6b40: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6b50: 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  b;.    zName = s
6b60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
6b70: 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  b, SCHEMA_TABLE(
6b80: 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65  iDb));.    pName
6b90: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c   = pName1;.  }el
6ba0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  se{.    /* The c
6bb0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
6bc0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
6bd0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
6be0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
6bf0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
6c00: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
6c10: 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  rn;.    if( !OMI
6c20: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6c30: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
6c40: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
6c50: 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74       /* If creat
6c60: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
6c70: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
6c80: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e  ot be qualified.
6c90: 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a   Unless .      *
6ca0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  * the database n
6cb0: 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e  ame is "temp" an
6cc0: 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  yway.  */.      
6cd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6ce0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
6cf0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
6d00: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
6d10: 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d");.      retur
6d20: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
6d30: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6d40: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
6d50: 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  1;.    zName = s
6d60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6d70: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
6d80: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e    }.  pParse->sN
6d90: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
6da0: 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  e;.  if( zName==
6db0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6dc0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
6dd0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
6de0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
6df0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
6e00: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6e10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
6e20: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
6e30: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
6e40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6e50: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
6e60: 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20  sert( isTemp==0 
6e70: 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a  || isTemp==1 );.
6e80: 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
6e90: 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31  ==0 || isView==1
6ea0: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74   );.  {.    stat
6eb0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64  ic const u8 aCod
6ec0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53  e[] = {.       S
6ed0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
6ee0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
6ef0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6f00: 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  BLE,.       SQLI
6f10: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a  TE_CREATE_VIEW,.
6f20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52         SQLITE_CR
6f30: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20  EATE_TEMP_VIEW. 
6f40: 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a     };.    char *
6f50: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6f60: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6f70: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
6f80: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6f90: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
6fa0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
6fb0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6fc0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6fd0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6fe0: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
6ff0: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
7000: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28 69  Check(pParse, (i
7010: 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b  nt)aCode[isTemp+
7020: 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20 20  2*isView],.     
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29    zName, 0, zDb)
7060: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7070: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7090: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
70a0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
70b0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
70c0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
70d0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
70e0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
70f0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
7100: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
7110: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7120: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7130: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7140: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7150: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7160: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7170: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7180: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7190: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
71a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
71b0: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
71c0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
71d0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
71e0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
71f0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
7200: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
7210: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
7220: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
7230: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7240: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7250: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7260: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7270: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7280: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7290: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72a0: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
72b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
72c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
72d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
72e0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
72f0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
7300: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7310: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7320: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7330: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7350: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7360: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7370: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7380: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7390: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
73a0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
73b0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
73c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
73d0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
73e0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
73f0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
7400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7410: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7420: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7430: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7440: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7450: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7460: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7470: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7480: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7490: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
74a0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
74b0: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
74c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
74d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
74e0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
74f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7500: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7510: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
7520: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7530: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
7540: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
7550: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
7560: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
7570: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
7580: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
7590: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
75a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  ;.  pTable->nRow
75b0: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
75c0: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
75d0: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
75e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
75f0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7600: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
7610: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
7620: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
7630: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
7640: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
7650: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
7660: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
7670: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
7680: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
7690: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
76a0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
76b0: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
76c0: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
76d0: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
76e0: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
76f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7700: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
7710: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
7720: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
7730: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
7740: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ce")==0 ){.    a
7750: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
7760: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
7770: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
7780: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7790: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
77a0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
77b0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
77c0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
77d0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
77e0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
77f0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
7800: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
7810: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
7820: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
7830: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
7840: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
7850: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7860: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7870: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
7880: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
7890: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
78a0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
78b0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
78c0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
78d0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
78e0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
78f0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
7900: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
7910: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
7920: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
7930: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7940: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
7950: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
7960: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
7970: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
7980: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
7990: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
79a0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
79b0: 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74  t addr1;.    int
79c0: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
79d0: 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c   int reg1, reg2,
79e0: 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75   reg3;.    /* nu
79f0: 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50  llRow[] is an OP
7a00: 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67  _Record encoding
7a10: 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69   of a row contai
7a20: 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a  ning 5 NULLs */.
7a30: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7a40: 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20   char nullRow[] 
7a50: 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 6, 0, 0, 0, 
7a60: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69  0, 0 };.    sqli
7a70: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7a80: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
7a90: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7aa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7ab0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7ac0: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ae0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
7af0: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
7b00: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
7b10: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
7b20: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
7b30: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
7b40: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
7b50: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
7b60: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7b70: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7b80: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7b90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7ba0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7bb0: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7bc0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7bd0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7bf0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
7c00: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
7c10: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
7c20: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
7c30: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
7c40: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64  (v, iDb);.    ad
7c50: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
7c60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
7c70: 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76  , reg3); VdbeCov
7c80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69  erage(v);.    fi
7c90: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
7ca0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
7cb0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
7cc0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
7cd0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
7ce0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
7cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7d10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7d20: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
7d30: 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20  fileFormat);.   
7d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7d60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
7d70: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e  EXT_ENCODING, EN
7d80: 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  C(db));.    sqli
7d90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7da0: 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20  v, addr1);..    
7db0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7dc0: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7dd0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7de0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7df0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
7e00: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
7e10: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
7e20: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
7e30: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
7e40: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7e50: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7e60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7e70: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7e80: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7e90: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7ea0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7eb0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7ec0: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7ed0: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7ee0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7ef0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
7f00: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
7f10: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
7f20: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
7f30: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
7f40: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
7f50: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
7f60: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
7f70: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
7f80: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
7f90: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
7fa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7fb0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7fc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7fd0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
7fe0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
7ff0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
8000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8010: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8020: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
8030: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8040: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
8050: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
8060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8070: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
8080: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
8090: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
80a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
80b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
80c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
80d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
80e0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
80f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8100: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
8110: 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c   6, reg3, 0, nul
8120: 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29  lRow, P4_STATIC)
8130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8140: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8150: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
8160: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8170: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8180: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81a0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
81b0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
81c0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
81d0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
81e0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
81f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8200: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8210: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8220: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8230: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8240: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
8250: 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f  Set properties o
8260: 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
8270: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d   based on the (m
8280: 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20  agical).** name 
8290: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  of the column..*
82a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
82b0: 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
82c0: 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  NS.void sqlite3C
82d0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
82e0: 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70  romName(Table *p
82f0: 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  Tab, Column *pCo
8300: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
8310: 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d  3_strnicmp(pCol-
8320: 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65  >zName, "__hidde
8330: 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  n__", 10)==0 ){.
8340: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8350: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49  gs |= COLFLAG_HI
8360: 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DDEN;.  }else if
8370: 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d  ( pTab && pCol!=
8380: 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70  pTab->aCol && (p
8390: 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73  Col[-1].colFlags
83a0: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
83b0: 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  N) ){.    pTab->
83c0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f  tabFlags |= TF_O
83d0: 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a  OOHidden;.  }.}.
83e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
83f0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
8400: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8410: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
8420: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
8430: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8440: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
8450: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
8460: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
8470: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
8480: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8490: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
84a0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
84b0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
84c0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
84d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
84e0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
84f0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
8500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8510: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
8520: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8530: 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  ame, Token *pTyp
8540: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8550: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
8560: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  *z;.  char *zTyp
8570: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
8580: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8590: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
85a0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
85b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
85c0: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
85d0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
85e0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
85f0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8600: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8620: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8630: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8640: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8650: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8660: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
8670: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8680: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8690: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
86a0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
86b0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  eturn;.  memcpy(
86c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
86d0: 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d  me->n);.  z[pNam
86e0: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  e->n] = 0;.  sql
86f0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
8700: 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71    zType = z + sq
8710: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
8720: 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   + 1;.  memcpy(z
8730: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8740: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 7a 54 79  pType->n);.  zTy
8750: 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30  pe[pType->n] = 0
8760: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8770: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8790: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
87a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
87b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
87c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
87d0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
87e0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
87f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8800: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8810: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8820: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
8830: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
8840: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
8850: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
8860: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8870: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
8880: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
8890: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
88a0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
88b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
88c0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
88d0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
88e0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
88f0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
8900: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
8910: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
8920: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
8930: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
8940: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
8950: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
8960: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
8970: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
8980: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
8990: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
89a0: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
89b0: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
89c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
89d0: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
89e0: 4f 42 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  OB'. */.    pCol
89f0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8a00: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
8a10: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8a20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8a30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8a40: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8a50: 54 79 70 65 28 7a 54 79 70 65 2c 20 26 70 43 6f  Type(zType, &pCo
8a60: 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 7d 0a 20  l->szEst);.  }. 
8a70: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50   p->nCol++;.  pP
8a80: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
8a90: 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f  Name.n = 0;.}../
8aa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8ab0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
8ac0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8ad0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8ae0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8af0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8b00: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
8b10: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
8b20: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
8b30: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
8b40: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
8b50: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
8b60: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
8b70: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
8b80: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
8b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8ba0: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
8bb0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
8bc0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
8bd0: 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  p;.  p = pParse-
8be0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
8bf0: 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
8c00: 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74  p->nCol<1) ) ret
8c10: 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70  urn;.  p->aCol[p
8c20: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c  ->nCol-1].notNul
8c30: 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  l = (u8)onError;
8c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
8c50: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
8c60: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
8c70: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
8c80: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
8c90: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
8ca0: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
8cb0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
8cc0: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
8cd0: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
8ce0: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
8cf0: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
8d00: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
8d10: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
8d20: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
8d30: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
8d40: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
8d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
8d60: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
8d70: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
8d80: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8d90: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
8da0: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
8db0: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
8dc0: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
8dd0: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
8de0: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
8df0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
8e00: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
8e10: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
8e20: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
8e30: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
8e60: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8e70: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
8e80: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
8e90: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8ea0: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
8eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8ec0: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
8ed0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8ee0: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
8ef0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8f00: 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27  F_BLOB.** 'REAL'
8f10: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8f20: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
8f30: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
8f40: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
8f50: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
8f60: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
8f70: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
8f80: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8f90: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
8fa0: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
8fb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
8fc0: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
8fd0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
8fe0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
8ff0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38  st char *zIn, u8
9000: 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32   *pszEst){.  u32
9010: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
9020: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9030: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
9040: 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30   char *zChar = 0
9050: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e  ;..  assert( zIn
9060: 21 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  !=0 );.  while( 
9070: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
9080: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
9090: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
90a0: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
90b0: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
90c0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
90d0: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
90e0: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
90f0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
9100: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9110: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9120: 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a     zChar = zIn;.
9130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9140: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
9150: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9160: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
9170: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
9180: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9190: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
91a0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
91b0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
91c0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
91d0: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
91e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
91f0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
9200: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
9210: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9220: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
9230: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
9240: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
9250: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9260: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
9270: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
9280: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9290: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
92a0: 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d       if( zIn[0]=
92b0: 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a  ='(' ) zChar = z
92c0: 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  In;.#ifndef SQLI
92d0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
92e0: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
92f0: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
9300: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
9310: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
9320: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
9330: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9340: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9350: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9360: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9370: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9380: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
9390: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
93a0: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
93b0: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
93c0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
93d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
93e0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
93f0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
9400: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9410: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
9420: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
9430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
9440: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
9450: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9460: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9470: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9480: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
9490: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
94a0: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
94b0: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
94c0: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
94d0: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
94e0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
94f0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
9500: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
9510: 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20  /* If pszEst is 
9520: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
9530: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
9540: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
9550: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
9560: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
9570: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
9580: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
9590: 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73    */.  if( pszEs
95a0: 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74  t ){.    *pszEst
95b0: 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 1;   /* defau
95c0: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
95d0: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
95e0: 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f   if( aff<SQLITE_
95f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9600: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
9610: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9620: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
9630: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9640: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
9650: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
9660: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20     int v = 0;.  
9670: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9680: 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c  3GetInt32(zChar,
9690: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
96a0: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
96b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
96c0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a  >255 ) v = 255;.
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a              *psz
96e0: 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42  Est = v; /* BLOB
96f0: 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c  (k), VARCHAR(k),
9700: 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b   CHAR(k) -> r=(k
9710: 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  /4+1) */.       
9720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9740: 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20    zChar++;.     
9750: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9760: 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73  {.        *pszEs
9770: 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42  t = 5;   /* BLOB
9780: 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20  , TEXT, CLOB -> 
9790: 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20  r=5  (approx 20 
97a0: 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d  bytes)*/.      }
97b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
97c0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
97d0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
97e0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
97f0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
9800: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9810: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
9820: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9830: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9840: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
9850: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
9860: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
9870: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
9880: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
9890: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
98a0: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
98b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
98c0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
98d0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
98e0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
98f0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
9900: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
9910: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9920: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
9930: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9940: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a  prSpan *pSpan){.
9950: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9960: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
9970: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9980: 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50  se->db;.  p = pP
9990: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
99a0: 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20  .  if( p!=0 ){. 
99b0: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
99c0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
99d0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
99e0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
99f0: 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d  rFunction(pSpan-
9a00: 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74  >pExpr, db->init
9a10: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
9a20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9a30: 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74  pParse, "default
9a40: 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
9a50: 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e   [%s] is not con
9a60: 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20  stant",.        
9a70: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a    pCol->zName);.
9a80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a90: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45   /* A copy of pE
9aa0: 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74  xpr is used inst
9ab0: 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ead of the origi
9ac0: 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f  nal, as pExpr co
9ad0: 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
9ae0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e  tokens that poin
9af0: 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65  t to volatile me
9b00: 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27  mory. The 'span'
9b10: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
9b20: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72  on.      ** is r
9b30: 65 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d  equired by pragm
9b40: 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20  a table_info..  
9b50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
9b60: 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r x;.      sqlit
9b70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9b80: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
9b90: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20       memset(&x, 
9ba0: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
9bb0: 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53       x.op = TK_S
9bc0: 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a  PAN;.      x.u.z
9bd0: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44  Token = sqlite3D
9be0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
9bf0: 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72  ar*)pSpan->zStar
9c00: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70         (int)(pSp
9c30: 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e  an->zEnd - pSpan
9c40: 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20  ->zStart));.    
9c50: 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 53 70 61    x.pLeft = pSpa
9c60: 6e 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n->pExpr;.      
9c70: 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53 6b 69  x.flags = EP_Ski
9c80: 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  p;.      pCol->p
9c90: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
9ca0: 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20 45 58  prDup(db, &x, EX
9cb0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
9cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9cd0: 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65  ee(db, x.u.zToke
9ce0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
9cf0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9d00: 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78  e(db, pSpan->pEx
9d10: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61  pr);.}../*.** Ba
9d20: 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62  ckwards Compatib
9d30: 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a  ility Hack:.** .
9d40: 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65  ** Historical ve
9d50: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
9d60: 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e 67   accepted string
9d70: 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s as column name
9d80: 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20  s in.** indexes 
9d90: 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20  and PRIMARY KEY 
9da0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20  constraints and 
9db0: 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  in UNIQUE constr
9dc0: 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a  aints.  Example:
9dd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
9de0: 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c  E TABLE xyz(a,b,
9df0: 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45  c,d,e,PRIMARY KE
9e00: 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62  Y('a'),UNIQUE('b
9e10: 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72  ','c' COLLATE tr
9e20: 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  im).**     CREAT
9e30: 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78  E INDEX abc ON x
9e40: 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c  yz('c','d' DESC,
9e50: 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  'e' COLLATE noca
9e60: 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20  se DESC);.**.** 
9e70: 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20  This is goofy.  
9e80: 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65 20  But to preserve 
9e90: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
9ea0: 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69  ibility we conti
9eb0: 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74  nue to.** accept
9ec0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
9ed0: 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65  ne does the nece
9ee0: 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e  ssary conversion
9ef0: 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a  .  It converts.*
9f00: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
9f10: 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72   given in its ar
9f20: 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b  gument from a TK
9f30: 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54  _STRING into a T
9f40: 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65  K_ID.** if the e
9f50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73  xpression is jus
9f60: 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69  t a TK_STRING wi
9f70: 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43  th an optional C
9f80: 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a  OLLATE clause..*
9f90: 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73 73  * If the epxress
9fa0: 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20  ion is anything 
9fb0: 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54  other than TK_ST
9fc0: 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73  RING, the expres
9fd0: 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61  sion is.** uncha
9fe0: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
9ff0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72 69  void sqlite3Stri
a000: 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b  ngToId(Expr *p){
a010: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
a020: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70  _STRING ){.    p
a030: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
a040: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
a050: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70  =TK_COLLATE && p
a060: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
a070: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d  STRING ){.    p-
a080: 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f  >pLeft->op = TK_
a090: 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ID;.  }.}../*.**
a0a0: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
a0b0: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
a0c0: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
a0d0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
a0e0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
a0f0: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
a100: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a110: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
a120: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
a130: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
a140: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
a150: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
a160: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
a170: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
a180: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
a190: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
a1a0: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
a1b0: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
a1c0: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
a1d0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
a1e0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
a1f0: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
a200: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
a210: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
a220: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
a230: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
a240: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
a250: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
a260: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
a270: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
a280: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
a290: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
a2a0: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
a2b0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
a2c0: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
a2d0: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
a2e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
a2f0: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
a300: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
a310: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
a320: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a330: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
a340: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
a350: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a360: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
a370: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
a380: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
a390: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
a3a0: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
a3b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
a3c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
a3d0: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
a3e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a3f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a400: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
a410: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
a420: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
a430: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
a440: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
a450: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
a460: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
a470: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
a480: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
a490: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
a4a0: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
a4b0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
a4c0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
a4d0: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
a4e0: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
a4f0: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
a500: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
a510: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
a520: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  pNewTable;.  con
a530: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
a540: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
a550: 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54   -1, i;.  int nT
a560: 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  erm;.  if( pTab=
a570: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
a580: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
a590: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a5a0: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
a5b0: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
a5c0: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
a5d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a5e0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
a5f0: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
a600: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
a610: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
a620: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
a630: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
a640: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
a650: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
a660: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
a670: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
a680: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
a690: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
a6a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a6b0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a6c0: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
a6d0: 20 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61   zName = pTab->a
a6e0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
a6f0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a  .    nTerm = 1;.
a700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65    }else{.    nTe
a710: 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rm = pList->nExp
a720: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
a730: 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nTerm; i++){. 
a740: 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70       Expr *pCExp
a750: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
a760: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
a770: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
a780: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45       assert( pCE
a790: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
a7a0: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
a7b0: 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20  d(pCExpr);.     
a7c0: 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d   if( pCExpr->op=
a7d0: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
a7e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
a7f0: 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75  Name = pCExpr->u
a800: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
a810: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
a820: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
a830: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
a840: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
a850: 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62  Cmp(zCName, pTab
a860: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
a870: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
a880: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
a890: 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20  [iCol].colFlags 
a8a0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
a8b0: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
a8c0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
a8d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a8f0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
a900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a920: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
a930: 7a 4e 61 6d 65 0a 20 20 20 26 26 20 73 71 6c 69  zName.   && sqli
a940: 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74  te3StrICmp(sqlit
a950: 65 33 53 74 72 4e 65 78 74 28 7a 4e 61 6d 65 29  e3StrNext(zName)
a960: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
a970: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21     && sortOrder!
a980: 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a  =SQLITE_SO_DESC.
a990: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69    ){.    pTab->i
a9a0: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
a9b0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
a9c0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
a9d0: 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e    assert( autoIn
a9e0: 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d  c==0 || autoInc=
a9f0: 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  =1 );.    pTab->
aa00: 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f  tabFlags |= auto
aa10: 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65  Inc*TF_Autoincre
aa20: 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ment;.    if( pL
aa30: 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50  ist ) pParse->iP
aa40: 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  kSortOrder = pLi
aa50: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
aa60: 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  er;.  }else if( 
aa70: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
aa80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
aa90: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
aaa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
aab0: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
aac0: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
aad0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
aae0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
aaf0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
ab00: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
ab10: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
ab20: 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61   p = sqlite3Crea
ab30: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
ab40: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
ab50: 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20  onError, 0,.    
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72         0, sortOr
ab80: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
ab90: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69   p ){.      p->i
aba0: 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  dxType = SQLITE_
abb0: 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
abc0: 45 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EY;.    }.    pL
abd0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
abe0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
abf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
ac00: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
ac10: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
ac20: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
ac30: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
ac40: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
ac50: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
ac60: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
ac70: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
ac80: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
ac90: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
aca0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
acb0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
acc0: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
acd0: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
ace0: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
acf0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
ad00: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
ad10: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
ad20: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ad30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ad40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
ad50: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
ad60: 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26  ECLARE_VTAB.   &
ad70: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  & !sqlite3BtreeI
ad80: 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44  sReadonly(db->aD
ad90: 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e  b[db->init.iDb].
ada0: 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  pBt).  ){.    pT
adb0: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
adc0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
add0: 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  nd(pParse, pTab-
ade0: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
adf0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  xpr);.    if( pP
ae00: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
ae10: 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20  Name.n ){.      
ae20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
ae30: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
ae40: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50  Tab->pCheck, &pP
ae50: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
ae60: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Name, 1);.    }.
ae70: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ae80: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
ae90: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
aea0: 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  >db, pCheckExpr)
aeb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
aec0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
aed0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
aee0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
aef0: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
af00: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
af10: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
af20: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
af30: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
af40: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
af50: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
af60: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
af70: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
af80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
af90: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
afa0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
afb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
afc0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
afd0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
afe0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
aff0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
b000: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
b010: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
b020: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
b030: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
b040: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
b050: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
b060: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b070: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
b080: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
b090: 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Idx;.    sqlite3
b0a0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
b0b0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20  ol[i].zColl);.  
b0c0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
b0d0: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
b0e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
b0f0: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
b100: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
b110: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
b120: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
b130: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
b140: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
b150: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
b160: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
b170: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
b180: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
b190: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
b1a0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
b1b0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
b1c0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
b1d0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
b1e0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
b1f0: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
b200: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
b210: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
b220: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
b230: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
b240: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
b250: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
b260: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
b270: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b280: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
b290: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b2a0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
b2b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
b2c0: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
b2d0: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
b2e0: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
b2f0: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
b300: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
b310: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
b320: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
b330: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b340: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
b350: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
b360: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
b370: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
b380: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
b390: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b3a0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
b3b0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
b3c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b3d0: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
b3e0: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
b3f0: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
b400: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
b410: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
b420: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
b430: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
b440: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
b450: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
b460: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
b470: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
b480: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
b490: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
b4a0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
b4b0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
b4c0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
b4d0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
b4e0: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
b4f0: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
b500: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
b510: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
b520: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b530: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
b540: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
b550: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b560: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
b570: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
b580: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
b590: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
b5a0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  or message..**.*
b5b0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
b5c0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b5d0: 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  , sqlite3GetColl
b5e0: 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  Seq().*/.CollSeq
b5f0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
b600: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
b610: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
b620: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
b630: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b640: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
b650: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
b660: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
b670: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
b680: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
b690: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
b6a0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
b6b0: 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , zName, initbus
b6c0: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
b6d0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
b6e0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
b6f0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
b700: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b710: 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43  (pParse, enc, pC
b720: 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  oll, zName);.  }
b730: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
b740: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
b750: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
b760: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
b770: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
b780: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
b790: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
b7a0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
b7b0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
b7c0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
b7d0: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
b7e0: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
b7f0: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
b800: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
b810: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
b820: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
b830: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
b840: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
b850: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
b860: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
b870: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
b880: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
b890: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
b8a0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
b8b0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
b8c0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
b8d0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
b8e0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
b8f0: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
b900: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
b910: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
b920: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
b930: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
b940: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
b950: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
b960: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
b970: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
b980: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
b990: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
b9a0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
b9b0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
b9c0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
b9d0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
b9e0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
b9f0: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
ba00: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
ba10: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
ba20: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
ba30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ba40: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
ba50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ba60: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
ba70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ba80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ba90: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
baa0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
bab0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bac0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
bad0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
bae0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
baf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bb00: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
bb10: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
bb20: 61 5f 63 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a  a_cookie+1);.}..
bb30: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
bb40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
bb50: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
bb60: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
bb70: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
bb80: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
bb90: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
bba0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
bbb0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
bbc0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
bbd0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
bbe0: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
bbf0: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
bc00: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
bc10: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
bc20: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
bc30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
bc40: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
bc50: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
bc60: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
bc70: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
bc80: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
bc90: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
bca0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
bcb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
bcc0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
bcd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
bce0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
bcf0: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
bd00: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
bd10: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
bd20: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
bd30: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
bd40: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
bd50: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
bd60: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
bd70: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
bd80: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
bd90: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
bda0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
bdb0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
bdc0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
bdd0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
bde0: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
bdf0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
be00: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
be10: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
be20: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
be30: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
be40: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
be50: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
be60: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
be70: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
be80: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
be90: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
bea0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
beb0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
bec0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
bed0: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
bee0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
bef0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
bf00: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
bf10: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
bf20: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
bf30: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
bf40: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
bf50: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
bf60: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
bf70: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
bf80: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
bf90: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
bfa0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
bfb0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
bfc0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
bfd0: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
bfe0: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
bff0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c000: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
c010: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
c020: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
c030: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
c040: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
c050: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
c060: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
c070: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
c080: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
c090: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
c0b0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
c0c0: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
c0d0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
c0e0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c0f0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
c100: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c110: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
c120: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
c130: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
c140: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
c150: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c160: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c170: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
c180: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
c190: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
c1a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c1b0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
c1c0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
c1d0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
c1e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
c1f0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
c200: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
c210: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
c220: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
c230: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
c240: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
c250: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c260: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
c270: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
c280: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
c290: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
c2a0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
c2b0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
c2c0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
c2d0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
c2e0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
c2f0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c300: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c310: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
c320: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
c330: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
c340: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
c350: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
c360: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
c370: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
c380: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
c390: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
c3a0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
c3b0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
c3c0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
c3d0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
c3e0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
c3f0: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
c400: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c410: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
c420: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
c430: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
c440: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
c450: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
c460: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
c470: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
c480: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
c490: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
c4a0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
c4b0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
c4c0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
c4d0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
c4e0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
c4f0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c500: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c510: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c520: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
c530: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
c540: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
c550: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
c560: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c570: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
c580: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
c590: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
c5a0: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
c5b0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c5c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
c5d0: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
c5e0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
c5f0: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
c600: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
c610: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
c620: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
c630: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c640: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c650: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
c660: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c670: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
c680: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
c690: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
c6a0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
c6b0: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
c6c0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c6d0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
c6e0: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
c6f0: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c700: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
c710: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
c720: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
c730: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c740: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c750: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
c760: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c770: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c780: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
c790: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c7a0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c7b0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
c7c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c7d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c7e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c7f0: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
c800: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c810: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
c820: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
c830: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
c840: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
c850: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
c860: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
c870: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
c880: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c890: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c8a0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
c8c0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
c8d0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
c8e0: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
c8f0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
c900: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
c910: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
c920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
c930: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
c940: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
c950: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
c960: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
c970: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
c980: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
c990: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
c9a0: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
c9b0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
c9c0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
c9d0: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
c9e0: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
c9f0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
ca00: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
ca10: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
ca20: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
ca30: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
ca40: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
ca50: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
ca60: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
ca70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ca80: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
ca90: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
caa0: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
cab0: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
cac0: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
cad0: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
cae0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
caf0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
cb00: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
cb10: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
cb20: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
cb30: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
cb40: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
cb50: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cb60: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
cb70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
cb80: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
cb90: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
cba0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
cbb0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
cbc0: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
cbd0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
cbe0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
cbf0: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
cc00: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
cc10: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
cc20: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
cc30: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
cc40: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
cc50: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
cc60: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
cc70: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
cc80: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
cc90: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
cca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ccb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
ccc0: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
ccd0: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
cce0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
ccf0: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
cd00: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
cd10: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
cd20: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
cd30: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
cd40: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
cd50: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
cd60: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
cd70: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
cd80: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
cd90: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
cda0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
cdb0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
cdc0: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
cdd0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
cde0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
cdf0: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
ce00: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
ce10: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
ce20: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
ce30: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
ce40: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
ce50: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
ce60: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
ce70: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
ce80: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
ce90: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
cea0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
ceb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
cec0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
ced0: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
cee0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
cef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
cf00: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
cf10: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
cf20: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
cf30: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
cf40: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
cf50: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
cf60: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
cf70: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
cf80: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
cf90: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e   value x is foun
cfa0: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  d any of the fir
cfb0: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
cfc0: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74  of aiCol[].*/.st
cfd0: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
cfe0: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
cff0: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
d000: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
d010: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28  nCol-- > 0 ) if(
d020: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
d030: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
d040: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d050: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
d060: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
d070: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
d080: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d090: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
d0a0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
d0b0: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
d0c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d0d0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
d0e0: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
d0f0: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
d100: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
d110: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
d120: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
d130: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
d140: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
d150: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
d160: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
d170: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
d180: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
d190: 20 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74    (1)  Convert t
d1a0: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
d1b0: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65  e into an OP_Cre
d1c0: 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65  ateIndex.  There
d1d0: 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
d1e0: 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20 66  no rowid btree f
d1f0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
d200: 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68  ID.  Instead, th
d210: 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20  e canonical.**  
d220: 20 20 20 20 20 20 20 20 64 61 74 61 20 73 74 6f          data sto
d230: 72 61 67 65 20 69 73 20 61 20 63 6f 76 65 72 69  rage is a coveri
d240: 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a  ng index btree..
d250: 2a 2a 20 20 20 20 20 28 32 29 20 20 42 79 70 61  **     (2)  Bypa
d260: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
d270: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
d280: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
d290: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
d2a0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d2b0: 20 61 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   as the primary 
d2c0: 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77  key index is now
d2d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 65  .**          ide
d2e0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
d2f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d300: 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  le entry of the 
d310: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  table itself..**
d320: 20 20 20 20 20 28 33 29 20 20 53 65 74 20 74 68       (3)  Set th
d330: 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20  e Index.tnum of 
d340: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d350: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
d360: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
d370: 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f  schema to the ro
d380: 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  otpage from the 
d390: 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  main table..**  
d3a0: 20 20 20 28 34 29 20 20 53 65 74 20 61 6c 6c 20     (4)  Set all 
d3b0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
d3c0: 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d  RIMARY KEY schem
d3d0: 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e  a object to be N
d3e0: 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20  OT NULL..**     
d3f0: 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62  (5)  Add all tab
d400: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
d410: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
d420: 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20  dex object.**   
d430: 20 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74         so that t
d440: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d450: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d460: 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73  ex.  The surplus
d470: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c  .**          col
d480: 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66  umns are part of
d490: 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
d4a0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65   and are not use
d4b0: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
d4c0: 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f    sorting or loo
d4d0: 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73  kup or uniquenes
d4e0: 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20  s checks..**    
d4f0: 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68   (6)  Replace th
d500: 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20  e rowid tail on 
d510: 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  all automaticall
d520: 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51  y generated UNIQ
d530: 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  UE.**          i
d540: 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20  ndices with the 
d550: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
d560: 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  mns..*/.static v
d570: 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  oid convertToWit
d580: 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50  houtRowidTable(P
d590: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
d5a0: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
d5b0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64  dex *pIdx;.  Ind
d5c0: 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e  ex *pPk;.  int n
d5d0: 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  Pk;.  int i, j;.
d5e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d5f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
d600: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d610: 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  pVdbe;..  /* Con
d620: 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61  vert the OP_Crea
d630: 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74  teTable opcode t
d640: 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c  hat would normal
d650: 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  ly create the.  
d660: 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72  ** root-page for
d670: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
d680: 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  an OP_CreateInde
d690: 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69  x opcode.  The i
d6a0: 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65  ndex.  ** create
d6b0: 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  d will become th
d6c0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
d6d0: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  dex..  */.  if( 
d6e0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
d6f0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
d700: 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v );.    sqlite
d710: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
d720: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  e(v, pParse->add
d730: 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65 61 74  rCrTab, OP_Creat
d740: 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  eIndex);.  }..  
d750: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
d760: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
d770: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
d780: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
d790: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
d7a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
d7b0: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
d7c0: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
d7d0: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
d7e0: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
d7f0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
d800: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b   *pList;.    Tok
d810: 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20  en ipkToken;.   
d820: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
d830: 74 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61  t(&ipkToken, pTa
d840: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
d850: 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
d860: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d870: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d880: 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20  Parse, 0, .     
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d8a0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
d8b0: 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b  , TK_ID, &ipkTok
d8c0: 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  en, 0));.    if(
d8d0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
d8e0: 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  rn;.    pList->a
d8f0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
d900: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
d910: 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rder;.    assert
d920: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
d930: 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
d940: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43 72   pPk = sqlite3Cr
d950: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
d960: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
d970: 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c  , pTab->keyConf,
d980: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
d990: 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20 72    if( pPk==0 ) r
d9a0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e  eturn;.    pPk->
d9b0: 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45  idxType = SQLITE
d9c0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
d9d0: 4b 45 59 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  KEY;.    pTab->i
d9e0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  PKey = -1;.  }el
d9f0: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
da00: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
da10: 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20  ndex(pTab);..   
da20: 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63   /* Bypass the c
da30: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  reation of the P
da40: 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65  RIMARY KEY btree
da50: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
da60: 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  master.    ** ta
da70: 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20  ble entry. This 
da80: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
da90: 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65   if currently ge
daa0: 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20  nerating VDBE.  
dab0: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
dac0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
dad0: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
dae0: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
daf0: 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64  ading.    ** a d
db00: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
db10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20 29    */.    if( v )
db20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
db30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
db40: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
db50: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
db60: 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20  e(v, pPk->tnum, 
db70: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  OP_Goto);.    }.
db80: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
db90: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
dba0: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
dbb0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
dbc0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
dbd0: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
dbe0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
dbf0: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
dc00: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
dc10: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
dc20: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
dc30: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
dc40: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
dc50: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
dc60: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
dc70: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
dc80: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
dc90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
dca0: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
dcb0: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
dcc0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
dcd0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
dce0: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
dcf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
dd00: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
dd10: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
dd20: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
dd30: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
dd40: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b  l = j;.  }.  pPk
dd50: 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
dd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21  ;.  assert( pPk!
dd70: 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50  =0 );.  nPk = pP
dd80: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
dd90: 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
dda0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
ddb0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e  PRIMARY KEY is N
ddc0: 4f 54 20 4e 55 4c 4c 2e 20 20 28 45 78 63 65 70  OT NULL.  (Excep
ddd0: 74 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 65  t,.  ** do not e
dde0: 6e 66 6f 72 63 65 20 74 68 69 73 20 66 6f 72 20  nforce this for 
ddf0: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
de00: 29 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e  ) */.  if( !db->
de10: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
de20: 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  le ){.    for(i=
de30: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
de40: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
de50: 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  [pPk->aiColumn[i
de60: 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f  ]].notNull = OE_
de70: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
de80: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
de90: 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  l = 1;.  }..  /*
dea0: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
deb0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
dec0: 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72  Y is the table r
ded0: 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50  oot page */.  pP
dee0: 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e  k->tnum = pTab->
def0: 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  tnum;..  /* Upda
df00: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
df10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
df20: 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e  of all UNIQUE in
df30: 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74  dices by convert
df40: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  ing.  ** the fin
df50: 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  al rowid column 
df60: 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  into one or more
df70: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
df80: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a  PRIMARY KEY..  *
df90: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
dfa0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
dfb0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
dfc0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  t){.    int n;. 
dfd0: 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79     if( IsPrimary
dfe0: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
dff0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
e000: 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b  or(i=n=0; i<nPk;
e010: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e020: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
e030: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
e040: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
e050: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e  aiColumn[i]) ) n
e060: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
e070: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
e080: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
e090: 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74   a superset of t
e0a0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
e0b0: 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43  /.      pIdx->nC
e0c0: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b  olumn = pIdx->nK
e0d0: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e  eyCol;.      con
e0e0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
e0f0: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
e100: 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c  Object(db, pIdx,
e110: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e   pIdx->nKeyCol+n
e120: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
e130: 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d  for(i=0, j=pIdx-
e140: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b  >nKeyCol; i<nPk;
e150: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e160: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
e170: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
e180: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
e190: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
e1a0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
e1b0: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d  Column[j] = pPk-
e1c0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e1d0: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
e1e0: 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[j] = pPk->azC
e1f0: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  oll[i];.        
e200: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e210: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e220: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49  Idx->nColumn>=pI
e230: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b  dx->nKeyCol+n );
e240: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
e250: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b  x->nColumn>=j );
e260: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61  .  }..  /* Add a
e270: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
e280: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
e290: 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20  KEY index.  */. 
e2a0: 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e   if( nPk<pTab->n
e2b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72  Col ){.    if( r
e2c0: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e2d0: 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e  (db, pPk, pTab->
e2e0: 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a  nCol) ) return;.
e2f0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e      for(i=0, j=n
e300: 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  Pk; i<pTab->nCol
e310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e320: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  ( !hasColumn(pPk
e330: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69  ->aiColumn, j, i
e340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
e350: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c  ert( j<pPk->nCol
e360: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
e370: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  Pk->aiColumn[j] 
e380: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b  = i;.        pPk
e390: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71  ->azColl[j] = sq
e3a0: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
e3b0: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e3c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e3d0: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c  ssert( pPk->nCol
e3e0: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73  umn==j );.    as
e3f0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e400: 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==j );.  }else{.
e410: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
e420: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
e430: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
e440: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e450: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
e460: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
e470: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
e480: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e490: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
e4a0: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
e4b0: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
e4c0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
e4d0: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
e4e0: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
e4f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
e500: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
e510: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
e520: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
e530: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
e540: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
e550: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
e560: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
e570: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
e580: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
e590: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
e5a0: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
e5b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
e5c0: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
e5d0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
e5e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e5f0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
e600: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
e610: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e620: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
e630: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e640: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
e650: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
e660: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
e670: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
e680: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
e690: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e6a0: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
e6b0: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
e6c0: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
e6d0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
e6e0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
e6f0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
e700: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
e710: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
e720: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
e730: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
e740: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
e750: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
e760: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
e770: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
e780: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
e790: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
e7a0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
e7b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
e7c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e7d0: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
e7e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e7f0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
e800: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
e810: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
e820: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
e830: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
e840: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
e850: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
e860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e870: 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
e880: 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
e890: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
e8a0: 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
e8b0: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
e8c0: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
e8d0: 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
e8e0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
e8f0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
e900: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
e910: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
e920: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
e950: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e960: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
e970: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
e980: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
e990: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
e9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e9b0: 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
e9c0: 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
e9d0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
ea00: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
ea10: 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
ea20: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
ea30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
ea40: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
ea50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
ea60: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
ea70: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
ea80: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
ea90: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
eaa0: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
eab0: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
eac0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
ead0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
eae0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
eaf0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
eb00: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
eb10: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
eb20: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
eb30: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
eb40: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
eb50: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
eb60: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
eb70: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
eb80: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
eb90: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
eba0: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
ebb0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
ebc0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
ebd0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ebe0: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
ebf0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
ec00: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20  routine.).  **. 
ec10: 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
ec20: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31  page number is 1
ec30: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69  , that means thi
ec40: 73 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f  s is the sqlite_
ec50: 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
ec60: 65 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61  e itself.  So ma
ec70: 72 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  rk it read-only.
ec80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
ec90: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
eca0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
ecb0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20  nit.newTnum;.   
ecc0: 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20   if( p->tnum==1 
ecd0: 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  ) p->tabFlags |=
ece0: 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20   TF_Readonly;.  
ecf0: 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
ed00: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
ed10: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62  ITHOUT ROWID Tab
ed20: 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62  les */.  if( tab
ed30: 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75  Opts & TF_Withou
ed40: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  tRowid ){.    if
ed50: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
ed60: 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
ed70: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
ed80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ed90: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41  se,.          "A
eda0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74  UTOINCREMENT not
edb0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48   allowed on WITH
edc0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
edd0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
ede0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
edf0: 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
ee00: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29  F_HasPrimaryKey)
ee10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
ee20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ee30: 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45  rse, "PRIMARY KE
ee40: 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62  Y missing on tab
ee50: 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  le %s", p->zName
ee60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
ee70: 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20      p->tabFlags 
ee80: 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77  |= TF_WithoutRow
ee90: 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  id | TF_NoVisibl
eea0: 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f  eRowid;.      co
eeb0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
eec0: 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  widTable(pParse,
eed0: 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   p);.    }.  }..
eee0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
eef0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
ef00: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
ef10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef20: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
ef30: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
ef40: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
ef50: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
ef60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
ef70: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Check ){.    sql
ef80: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
ef90: 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
efa0: 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20   p, NC_IsCheck, 
efb0: 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20  0, p->pCheck);. 
efc0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
efd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
efe0: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
eff0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
f000: 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20  verage row size 
f010: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
f020: 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65  d for all implie
f030: 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65  d indices */.  e
f040: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
f050: 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  h(p);.  for(pIdx
f060: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
f070: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
f080: 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74  xt){.    estimat
f090: 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78  eIndexWidth(pIdx
f0a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
f0b0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
f0c0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
f0d0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
f0e0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
f0f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
f100: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
f110: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
f120: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
f130: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
f140: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
f150: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
f160: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
f170: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
f180: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
f190: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
f1a0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
f1b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
f1c0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
f1d0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
f1e0: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
f1f0: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
f200: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
f210: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
f220: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
f230: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
f240: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
f250: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
f260: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
f270: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
f280: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f290: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
f2a0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ==0) ) return;..
f2b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f2c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
f2d0: 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a  e, 0);..    /* .
f2e0: 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a      ** Initializ
f2f0: 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  e zType for the 
f300: 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c  new view or tabl
f310: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
f320: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
f330: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
f340: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
f350: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
f360: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
f370: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
f380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f390: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
f3a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
f3b0: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
f3c0: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
f3d0: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
f3e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
f3f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
f400: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
f410: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
f420: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
f430: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
f440: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
f450: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
f460: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
f470: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
f480: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
f490: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  is in register p
f4a0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
f4b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
f4c0: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
f4d0: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
f4e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
f4f0: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
f500: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
f510: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
f520: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f530: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
f540: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
f550: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
f560: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
f570: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
f580: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
f590: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
f5a0: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
f5b0: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
f5c0: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
f5d0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
f5e0: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
f5f0: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
f600: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
f610: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
f620: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
f630: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
f640: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
f650: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
f660: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
f670: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
f680: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
f690: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20     /* Where the 
f6a0: 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74  SELECT should st
f6b0: 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ore results */. 
f6c0: 20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c       int regYiel
f6d0: 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  d;       /* Regi
f6e0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d  ster holding co-
f6f0: 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f  routine entry-po
f700: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  int */.      int
f710: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
f720: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63   /* Top of the c
f730: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
f740: 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20     int regRec;  
f750: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f         /* A reco
f760: 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20  rd to be insert 
f770: 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  into the new tab
f780: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  le */.      int 
f790: 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20  regRowid;       
f7a0: 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20  /* Rowid of the 
f7b0: 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65  next row to inse
f7c0: 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rt */.      int 
f7d0: 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20  addrInsLoop;    
f7e0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
f7f0: 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67  op for inserting
f800: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54   rows */.      T
f810: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
f820: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68     /* A table th
f830: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
f840: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
f850: 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65  */..      regYie
f860: 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ld = ++pParse->n
f870: 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65  Mem;.      regRe
f880: 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  c = ++pParse->nM
f890: 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77  em;.      regRow
f8a0: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
f8b0: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
f8c0: 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d  t(pParse->nTab==
f8d0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f8e0: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
f8f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f900: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f910: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70  _OpenWrite, 1, p
f920: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20  Parse->regRoot, 
f930: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
f940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
f950: 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  v, OPFLAG_P2ISRE
f960: 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  G);.      pParse
f970: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
f980: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
f990: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f9a0: 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20  dr(v) + 1;.     
f9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9c0: 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
f9d0: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
f9e0: 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
f9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
fa00: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
fa10: 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
fa20: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
fa30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
fa40: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
fa50: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
fa60: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
fa70: 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65  outine(v, regYie
fa80: 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
fa90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
faa0: 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a  , addrTop - 1);.
fab0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
fac0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
fad0: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
fae0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
faf0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
fb00: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
fb10: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
fb20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
fb30: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
fb40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
fb50: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
fb60: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nCol;.      p->a
fb70: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
fb80: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
fb90: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
fba0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
fbb0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
fbc0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
fbd0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
fbe0: 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
fbf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fc00: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
fc10: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
fc20: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
fc30: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fc40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fc50: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
fc60: 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
fc70: 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
fc80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
fc90: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
fca0: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
fcb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fcc0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
fcd0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
fce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fcf0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
fd00: 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
fd10: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
fd20: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
fd30: 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
fd40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
fd60: 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
fd70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fd80: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
fd90: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
fda0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
fdb0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
fdc0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
fdd0: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
fde0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
fdf0: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
fe00: 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
fe10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe20: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
fe30: 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
fe40: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
fe50: 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
fe60: 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
fe70: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
fe80: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
fe90: 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
fea0: 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
feb0: 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
fec0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
fed0: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
fee0: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
fef0: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
ff00: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
ff10: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
ff20: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
ff30: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
ff40: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
ff50: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
ff60: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
ff70: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
ff80: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
ff90: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
ffa0: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
ffb0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
ffc0: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
ffd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
ffe0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
fff0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
10000 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
10010 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
10020 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
10030 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
10040 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
10050 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
10060 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
10070 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
10080 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10090 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
100a0 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
100b0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
100c0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
100d0 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
100e0 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
100f0 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
10100 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
10110 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10120 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
10130 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10140 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
10150 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10160 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
10170 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
10180 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
10190 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
101a0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
101b0 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
101c0 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
101d0 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
101e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
101f0 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
10200 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
10210 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
10220 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
10230 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10240 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
10250 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
10260 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
10270 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
10280 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
10290 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
102a0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
102b0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
102c0 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
102d0 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
102e0 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
102f0 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
10300 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
10310 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
10320 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
10330 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
10340 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
10350 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
10360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10370 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
10380 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
10390 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
103a0 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
103b0 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27  '%q' AND type!='
103c0 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e  trigger'", p->zN
103d0 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
103e0 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
103f0 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
10400 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
10410 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
10420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10430 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10440 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
10450 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
10460 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
10470 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10480 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10490 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
104a0 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
104b0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
104c0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
104d0 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a  , p->zName, p);.
104e0 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
104f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
10500 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
10510 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
10520 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
10530 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
10540 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
10550 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
10560 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
10570 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10580 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c   = 0;.    db->fl
10590 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
105a0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
105b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
105c0 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
105d0 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
105e0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
105f0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
10600 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72  onst char *)pPar
10610 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
10620 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
10630 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
10640 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
10650 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
10660 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
10670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
10680 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
10690 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65     }.      nName
106a0 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20   = (int)((const 
106b0 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
106c0 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  - zName);.      
106d0 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20  p->addColOffset 
106e0 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74  = 13 + sqlite3Ut
106f0 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c  f8CharLen(zName,
10700 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23   nName);.    }.#
10710 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
10720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10730 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
10740 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
10750 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
10760 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
10770 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
10780 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
10790 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
107a0 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
107b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
107c0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
107d0 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
107e0 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
107f0 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
10800 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
10810 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
10820 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
10830 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
10840 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
10850 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
10860 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
10870 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
10880 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
10890 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43  /.  ExprList *pC
108a0 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e  Names, /* Option
108b0 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20  al list of view 
108c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
108d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
108e0 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
108f0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10900 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
10910 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
10920 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
10930 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
10940 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
10950 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
10960 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
10970 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
10980 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79   if VIEW already
10990 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
109a0 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
109b0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
109c0 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
109d0 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
109e0 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
109f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b   = 0;.  int iDb;
10a00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10a10 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
10a20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
10a30 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
10a40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10a50 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
10a60 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
10a70 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f   views");.    go
10a80 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
10a90 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ail;.  }.  sqlit
10aa0 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
10ab0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
10ac0 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
10ad0 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
10ae0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10af0 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
10b00 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
10b10 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
10b20 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65  w_fail;.  sqlite
10b30 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
10b40 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
10b50 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
10b60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
10b70 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
10b80 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
10b90 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
10ba0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
10bb0 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b   "view", pName);
10bc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
10bd0 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
10be0 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63  Select) ) goto c
10bf0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
10c00 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
10c10 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
10c20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10c30 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
10c40 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
10c50 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
10c60 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
10c70 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
10c80 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
10c90 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
10ca0 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
10cb0 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
10cc0 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
10cd0 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
10ce0 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
10cf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
10d00 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
10d10 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
10d20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
10d30 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
10d40 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52  b, pSelect, EXPR
10d50 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 70  DUP_REDUCE);.  p
10d60 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
10d70 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
10d80 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44  , pCNames, EXPRD
10d90 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66  UP_REDUCE);.  if
10da0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
10db0 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  ed ) goto create
10dc0 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
10dd0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
10de0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
10df0 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
10e00 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
10e10 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
10e20 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
10e30 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
10e40 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e  n;.  assert( sEn
10e50 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69  d.z[0]!=0 );.  i
10e60 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  f( sEnd.z[0]!=';
10e70 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
10e80 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
10e90 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
10ea0 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
10eb0 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
10ec0 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20  assert( n>0 );. 
10ed0 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
10ee0 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
10ef0 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20  Isspace(z[n-1]) 
10f00 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
10f10 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
10f20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
10f30 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
10f40 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
10f50 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
10f60 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
10f70 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
10f80 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
10f90 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b  0, &sEnd, 0, 0);
10fa0 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  ..create_view_fa
10fb0 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  il:.  sqlite3Sel
10fc0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
10fd0 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
10fe0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
10ff0 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20  db, pCNames);.  
11000 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
11010 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11020 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
11030 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11040 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
11050 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11060 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
11070 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
11080 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
11090 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
110a0 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
110b0 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
110c0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
110d0 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
110e0 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
110f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
11100 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
11110 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
11120 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
11130 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
11140 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
11150 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
11160 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
11170 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
11180 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
11190 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
111a0 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
111b0 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
111c0 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
111d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
111e0 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
111f0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
11200 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
11210 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
11220 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
11230 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
11240 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
11250 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
11260 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
11270 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
11280 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
11290 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71  assigned */.  sq
112a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
112b0 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
112c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
112d0 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  for malloc error
112e0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78  s */.  sqlite3_x
112f0 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20  auth xAuth;     
11300 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68    /* Saved xAuth
11310 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
11320 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
11330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11340 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11350 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
11360 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
11370 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
11380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11390 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
113a0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
113b0 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
113c0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
113d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
113e0 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
113f0 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
11400 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
11410 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
11420 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
11430 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
11440 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
11450 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
11460 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
11470 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
11480 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
11490 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
114a0 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
114b0 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
114c0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
114d0 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
114e0 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
114f0 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
11500 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
11510 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
11520 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
11530 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
11540 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
11550 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
11560 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
11570 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
11580 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
11590 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
115a0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
115b0 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
115c0 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
115d0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
115e0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
115f0 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
11600 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
11610 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
11620 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
11630 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
11640 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
11650 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
11660 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
11670 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
11680 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
11690 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
116a0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
116b0 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
116c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
116d0 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
116e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
116f0 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
11700 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
11710 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
11720 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
11730 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
11740 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
11750 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
11760 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
11770 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
11780 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
11790 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
117a0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
117b0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
117c0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
117d0 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
117e0 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
117f0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
11800 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
11810 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
11820 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
11830 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
11840 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
11850 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
11860 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
11870 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
11880 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
11890 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
118a0 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
118b0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
118c0 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
118d0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
118e0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
118f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
11900 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 69  ->pSelect );.  i
11910 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  f( pTable->pChec
11920 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  k ){.    db->loo
11930 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
11940 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  +;.    sqlite3Co
11950 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
11960 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11970 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c            &pTabl
119a0 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65  e->nCol, &pTable
119b0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 64 62 2d  ->aCol);.    db-
119c0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61  >lookaside.bDisa
119d0 62 6c 65 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ble--;.  }else{.
119e0 20 20 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74      pSel = sqlit
119f0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
11a00 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
11a10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65   0);.    if( pSe
11a20 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70  l ){.      n = p
11a30 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
11a40 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
11a50 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
11a60 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
11a70 63 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  c);.      pTable
11a80 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
11a90 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11aa0 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66  .bDisable++;.#if
11ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11ac0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11ad0 20 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d       xAuth = db-
11ae0 3e 78 41 75 74 68 3b 0a 20 20 20 20 20 20 64 62  >xAuth;.      db
11af0 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
11b00 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
11b10 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11b20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11b30 65 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78  el);.      db->x
11b40 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
11b50 6c 73 65 0a 20 20 20 20 20 20 70 53 65 6c 54 61  lse.      pSelTa
11b60 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
11b70 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
11b80 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
11b90 69 66 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  if.      db->loo
11ba0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
11bb0 2d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  -;.      pParse-
11bc0 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 20  >nTab = n;.     
11bd0 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
11be0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11bf0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
11c00 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  );.        pTabl
11c10 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
11c20 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
11c30 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
11c40 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
11c50 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
11c60 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
11c70 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
11c80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
11c90 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
11ca0 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
11cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
11cc0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
11cd0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62  Held(db, 0, pTab
11ce0 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  le->pSchema) );.
11cf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11d00 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
11d10 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
11d20 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Err++;.      }. 
11d30 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
11d40 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
11d50 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
11d60 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
11d70 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 6c     }.  }.  pTabl
11d80 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
11d90 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
11da0 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64  resetViews;.#end
11db0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11dc0 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
11dd0 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
11de0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
11df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11e00 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
11e10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11e20 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
11e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11e40 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
11e50 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
11e60 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
11e70 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
11e80 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
11e90 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
11ea0 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
11eb0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
11ec0 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
11ed0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
11ee0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
11ef0 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
11f00 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
11f10 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
11f20 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
11f30 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
11f40 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
11f50 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
11f60 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
11f70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
11f80 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
11f90 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
11fa0 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
11fb0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
11fc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11fd0 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
11fe0 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
11ff0 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
12000 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
12010 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
12020 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
12030 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
12040 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
12050 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
12060 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
12070 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
12080 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12090 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
120a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
120b0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
120c0 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
120d0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
120e0 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
120f0 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
12100 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
12110 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
12120 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
12130 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
12140 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
12150 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
12160 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
12170 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
12180 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
12190 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
121a0 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
121b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
121c0 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
121d0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
121e0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
121f0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
12200 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
12210 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
12220 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
12230 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
12240 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
12250 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
12260 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
12270 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12280 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
12290 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
122a0 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
122b0 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
122c0 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
122d0 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
122e0 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
122f0 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
12300 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
12310 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
12320 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
12330 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
12340 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
12350 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
12360 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
12370 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
12380 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
12390 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
123a0 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
123b0 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
123c0 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
123d0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
123e0 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
123f0 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
12400 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
12410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12420 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
12430 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
12440 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
12450 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
12460 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
12470 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
12480 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
12490 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
124a0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
124b0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
124c0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
124d0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
124e0 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
124f0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
12500 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
12510 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
12520 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
12530 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
12540 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
12550 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
12560 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12570 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
12580 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
12590 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
125a0 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
125b0 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
125c0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
125d0 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
125e0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
125f0 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
12600 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
12610 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
12620 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
12630 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
12640 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
12650 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
12660 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
12670 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
12680 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
12690 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
126a0 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
126b0 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
126c0 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
126d0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
126e0 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
126f0 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
12700 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
12710 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
12720 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
12730 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
12740 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
12750 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
12760 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
12770 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
12780 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
12790 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
127a0 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
127b0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
127c0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
127d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
127e0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
127f0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
12800 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12810 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
12820 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
12830 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12840 20 61 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e   assert( iTable>
12850 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  1 );.  sqlite3Vd
12860 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
12870 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
12880 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  r1, iDb);.  sqli
12890 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
128a0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
128b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
128c0 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
128d0 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
128e0 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
128f0 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
12900 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
12910 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
12920 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
12930 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
12940 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
12950 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
12960 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
12970 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
12980 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
12990 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
129a0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
129b0 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
129c0 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
129d0 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
129e0 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
129f0 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
12a00 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
12a10 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61   grammar rules a
12a20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12a30 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  he TK_REGISTER. 
12a40 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64   ** token for ad
12a50 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12a60 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  tion..  */.  sql
12a70 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
12a80 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
12a90 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
12aa0 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
12ab0 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
12ac0 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
12ad0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
12ae0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
12af0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
12b00 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
12b10 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
12b20 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
12b30 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
12b40 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
12b50 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
12b60 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
12b70 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
12b80 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
12b90 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
12ba0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12bb0 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
12bc0 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
12bd0 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
12be0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
12bf0 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
12c00 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
12c10 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
12c20 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
12c30 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
12c40 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
12c50 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
12c60 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
12c70 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
12c80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12c90 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
12ca0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12cb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
12cc0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
12cd0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
12ce0 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
12cf0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
12d00 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f  chema);.  destro
12d10 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
12d20 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44  , pTab->tnum, iD
12d30 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
12d40 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
12d50 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
12d60 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
12d70 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
12d80 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
12d90 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
12da0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
12db0 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
12dc0 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
12dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12de0 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
12df0 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
12e00 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
12e10 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
12e20 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
12e30 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
12e40 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
12e50 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
12e60 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
12e70 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
12e80 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
12e90 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
12ea0 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
12eb0 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
12ec0 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
12ed0 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
12ee0 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
12ef0 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
12f00 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
12f10 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
12f20 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
12f30 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
12f40 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
12f50 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
12f60 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
12f70 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
12f80 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
12f90 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
12fa0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
12fb0 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
12fc0 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
12fd0 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
12fe0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
12ff0 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
13000 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
13010 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
13020 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
13030 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
13040 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
13050 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
13060 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
13070 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
13080 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
13090 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
130a0 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
130b0 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
130c0 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
130d0 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
130e0 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
130f0 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
13100 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
13110 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
13120 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
13130 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
13140 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
13150 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
13160 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
13170 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
13180 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
13190 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
131a0 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
131b0 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
131c0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
131d0 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
131e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
131f0 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
13200 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
13210 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
13220 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13230 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
13240 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
13250 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ema);.      asse
13260 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
13270 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44  b<pParse->db->nD
13280 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  b );.      destr
13290 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
132a0 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
132b0 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
132c0 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
132d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
132e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
132f0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
13300 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
13310 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
13320 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
13330 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
13340 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
13350 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
13360 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
13370 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
13380 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
133a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
133b0 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
133c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
133d0 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
133e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
133f0 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
13400 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
13410 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13420 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
13430 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
13440 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
13450 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
13460 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
13470 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
13480 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31  zName;.  for(i=1
13490 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=4; i++){.  
134a0 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b    char zTab[24];
134b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
134c0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61  rintf(sizeof(zTa
134d0 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f  b),zTab,"sqlite_
134e0 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20  stat%d",i);.    
134f0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
13500 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
13510 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20   zTab, zDbName) 
13520 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13530 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
13540 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
13550 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
13560 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20  HERE %s=%Q",.   
13570 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54       zDbName, zT
13580 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65  ab, zType, zName
13590 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
135a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
135b0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72  erate code to dr
135c0 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  op a table..*/.v
135d0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44  oid sqlite3CodeD
135e0 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
135f0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
13600 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  Tab, int iDb, in
13610 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62  t isView){.  Vdb
13620 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
13630 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13640 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  ;.  Trigger *pTr
13650 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62  igger;.  Db *pDb
13660 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
13670 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
13680 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13690 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
136a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
136b0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
136c0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
136d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
136e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
136f0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
13700 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13720 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
13730 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
13740 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
13750 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
13760 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
13770 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
13780 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61  e.  ** is genera
13790 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
137a0 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
137b0 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
137c0 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
137d0 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
137e0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69  red..  */.  pTri
137f0 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
13800 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65  iggerList(pParse
13810 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65  , pTab);.  while
13820 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
13830 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
13840 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
13850 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
13860 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
13870 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
13880 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
13890 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
138a0 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
138b0 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
138c0 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
138d0 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  gger->pNext;.  }
138e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
138f0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
13900 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
13910 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
13920 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
13930 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
13940 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ted with.  ** th
13950 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
13960 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
13970 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
13980 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
13990 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
139a0 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
139b0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
139c0 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
139d0 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73   to.  ** move as
139e0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
139f0 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
13a00 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
13a10 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   mode)..  */.  i
13a20 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
13a30 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
13a40 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
13a50 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13a60 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45  Parse,.      "DE
13a70 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
13a80 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
13a90 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
13aa0 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
13ab0 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
13ac0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13ad0 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
13ae0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
13af0 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
13b00 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
13b10 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
13b20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
13b30 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
13b40 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
13b50 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
13b60 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
13b70 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13b80 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
13b90 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
13ba0 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
13bb0 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
13bc0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
13bd0 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
13be0 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
13bf0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
13c00 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
13c10 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
13c20 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
13c30 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
13c40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
13c50 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
13c60 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
13c70 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
13c80 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
13c90 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
13ca0 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
13cb0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
13cc0 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
13cd0 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69  me);.  if( !isVi
13ce0 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
13cf0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65  (pTab) ){.    de
13d00 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
13d10 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  e, pTab);.  }.. 
13d20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
13d30 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
13d40 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
13d50 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
13d60 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
13d70 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f  ema cookie..  */
13d80 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13d90 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13db0 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20  v, OP_VDestroy, 
13dc0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
13dd0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
13de0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13df0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
13e00 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
13e10 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
13e20 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
13e30 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
13e40 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
13e50 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
13e60 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
13e70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13e80 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
13e90 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
13ea0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
13eb0 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
13ec0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
13ed0 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
13ee0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
13ef0 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
13f00 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
13f10 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
13f20 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
13f30 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
13f40 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
13f50 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13f60 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
13f70 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13f80 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
13f90 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
13fa0 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
13fb0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
13fc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13fd0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
13fe0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
13ff0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
14000 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
14010 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
14020 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
14030 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61  ressErr++;.  pTa
14040 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
14050 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
14060 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d  e, isView, &pNam
14070 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20  e->a[0]);.  if( 
14080 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
14090 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66  ressErr--;..  if
140a0 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
140b0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c   if( noErr ) sql
140c0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
140d0 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
140e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
140f0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f  atabase);.    go
14100 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14110 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
14120 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
14130 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
14140 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
14150 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
14160 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
14170 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
14180 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
14190 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
141a0 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
141b0 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
141c0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
141d0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
141e0 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
141f0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
14200 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
14210 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
14220 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
14230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14240 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
14250 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
14260 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
14270 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
14280 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
14290 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
142a0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
142b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
142c0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
142d0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
142e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
142f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
14300 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
14310 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
14320 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14330 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
14340 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
14350 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
14360 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
14370 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14380 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
14390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
143a0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
143b0 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
143c0 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
143d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
143e0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
143f0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
14400 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
14410 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
14420 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
14430 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
14440 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
14450 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
14460 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
14470 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
14480 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
14490 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
144a0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
144b0 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
144c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
144d0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
144e0 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
144f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14500 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14510 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
14520 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
14530 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
14540 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
14550 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14560 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14570 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14580 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
14590 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
145a0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
145b0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
145c0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
145d0 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
145e0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
145f0 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
14600 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
14610 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
14620 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
14630 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
14640 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
14650 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14660 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
14670 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
14680 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14690 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
146a0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
146b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
146c0 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
146d0 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
146e0 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
146f0 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
14700 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
14710 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
14720 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
14730 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14740 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
14750 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14760 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
14770 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
14780 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
14790 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
147a0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
147b0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
147c0 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
147d0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
147e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
147f0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
14800 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
14810 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
14820 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14830 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14840 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14850 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14860 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
14870 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
14880 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
14890 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
148a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
148b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
148c0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
148d0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
148e0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
148f0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
14900 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
14910 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
14920 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
14930 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b  );.    sqlite3Fk
14940 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
14950 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a  , pName, pTab);.
14960 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
14970 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
14980 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
14990 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
149a0 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
149b0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
149c0 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
149d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
149e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
149f0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
14a00 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
14a10 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
14a20 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
14a30 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
14a40 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
14a50 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
14a60 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
14a70 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
14a80 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
14a90 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
14aa0 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
14ab0 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
14ac0 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
14ad0 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
14ae0 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
14af0 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28  le referred to (
14b00 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e  a.k.a the "paren
14b10 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43  t" table).  pToC
14b20 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20  ol is a list.** 
14b30 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
14b40 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c   parent pTo tabl
14b50 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  e.  flags contai
14b60 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
14b70 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
14b80 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
14b90 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
14ba0 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
14bb0 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
14bc0 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
14bd0 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
14be0 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
14bf0 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
14c00 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
14c10 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
14c20 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
14c30 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
14c40 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
14c50 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  e field..**.** T
14c60 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
14c70 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
14c80 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
14c90 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
14ca0 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
14cb0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
14cc0 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
14cd0 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
14ce0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14cf0 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
14d00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14d10 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
14d20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14d30 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
14d40 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
14d50 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
14d60 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
14d70 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
14d80 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
14d90 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
14da0 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
14db0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
14dc0 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
14dd0 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
14de0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
14df0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
14e00 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
14e10 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
14e20 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  s. */.){.  sqlit
14e30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14e40 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
14e50 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
14e60 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
14e70 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a  ey = 0;.  FKey *
14e80 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65  pNextTo;.  Table
14e90 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
14ea0 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
14eb0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
14ec0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
14ed0 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
14ee0 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
14ef0 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c   p==0 || IN_DECL
14f00 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
14f10 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
14f20 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
14f30 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
14f40 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e  Col-1;.    if( N
14f50 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67  EVER(iCol<0) ) g
14f60 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
14f70 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
14f80 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
14f90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14fa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14fb0 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
14fc0 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
14fd0 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
14fe0 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
14ff0 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
15000 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
15010 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
15020 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
15030 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
15040 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
15050 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15060 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
15070 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
15080 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15090 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
150a0 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
150b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
150c0 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
150d0 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
150e0 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
150f0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
15100 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
15110 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
15120 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
15130 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
15140 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
15150 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
15160 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  Key) + (nCol-1)*
15170 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
15180 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
15190 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
151a0 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
151b0 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
151c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
151d0 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
151e0 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
151f0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
15200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
15210 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
15220 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
15230 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
15240 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  y==0 ){.    goto
15250 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70   fk_end;.  }.  p
15260 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
15270 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
15280 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
15290 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
152a0 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b  Key->aCol[nCol];
152b0 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
152c0 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
152d0 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
152e0 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
152f0 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
15300 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f  e(z);.  z += pTo
15310 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
15320 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
15330 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
15340 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
15350 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
15360 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
15370 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15380 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15390 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
153a0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
153b0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
153c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
153d0 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
153e0 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
153f0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
15400 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
15410 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
15420 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
15430 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
15440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15450 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
15460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15470 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15480 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
15490 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
154a0 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
154b0 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
154c0 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
154d0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
154e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
154f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
15500 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
15510 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
15520 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15530 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
15540 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15550 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
15560 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
15570 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
15580 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
15590 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
155a0 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
155b0 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
155c0 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
155d0 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
155e0 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
155f0 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
15600 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73  [0] = (u8)(flags
15610 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20   & 0xff);       
15620 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54       /* ON DELET
15630 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46  E action */.  pF
15640 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20  Key->aAction[1] 
15650 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e  = (u8)((flags >>
15660 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20   8 ) & 0xff);   
15670 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63   /* ON UPDATE ac
15680 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
15690 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
156a0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
156b0 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a   p->pSchema) );.
156c0 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65    pNextTo = (FKe
156d0 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49  y *)sqlite3HashI
156e0 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
156f0 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20  a->fkeyHash, .  
15700 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
15710 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
15720 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
15730 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 73  ==pFKey ){.    s
15740 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
15750 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  b);.    goto fk_
15760 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
15770 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
15780 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
15790 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
157a0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
157b0 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
157c0 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
157d0 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
157e0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
157f0 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
15800 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
15810 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
15820 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
15830 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
15840 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
15850 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
15860 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
15870 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15880 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
15890 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
158a0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
158b0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
158c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
158d0 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
158e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
158f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
15900 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
15910 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
15920 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
15930 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
15940 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
15950 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
15960 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
15970 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
15980 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
15990 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
159a0 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
159b0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
159c0 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
159d0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
159e0 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
159f0 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
15a00 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
15a10 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
15a20 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
15a30 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
15a40 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
15a50 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15a60 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
15a70 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
15a80 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
15a90 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
15aa0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
15ab0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
15ac0 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
15ad0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
15ae0 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
15af0 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
15b00 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
15b10 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
15b20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
15b30 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
15b40 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
15b50 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15b60 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
15b70 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
15b80 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
15b90 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
15ba0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
15bb0 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
15bc0 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
15bd0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
15be0 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
15bf0 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
15c00 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
15c10 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
15c20 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
15c30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
15c40 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
15c50 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
15c60 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
15c70 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
15c80 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
15c90 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
15ca0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
15cb0 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
15cc0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
15cd0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
15ce0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
15cf0 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
15d00 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
15d10 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
15d20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
15d30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15d40 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
15d50 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
15d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15d70 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
15d80 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
15d90 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
15da0 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
15db0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
15dc0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
15dd0 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
15de0 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
15df0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
15e00 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
15e10 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
15e20 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
15e30 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
15e40 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
15e50 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
15e60 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
15e70 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
15e80 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
15e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
15ea0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
15eb0 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
15ec0 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
15ed0 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
15ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
15ef0 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
15f00 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
15f10 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
15f20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15f30 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
15f40 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
15f50 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
15f80 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
15f90 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
15fa0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
15fb0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
15fc0 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
15fd0 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
15fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15ff0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
16000 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
16010 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
16020 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
16030 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
16040 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
16050 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
16060 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
16090 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e  ing assembled in
160a0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
160b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
160c0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
160d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
160e0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
160f0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
16100 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
16110 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
16120 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
16130 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
16140 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
16150 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16160 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
16170 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
16180 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
16190 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
161a0 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
161b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
161c0 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69  /* Require a wri
161d0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  te-lock on the t
161e0 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  able to perform 
161f0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
16200 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
16210 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
16220 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c  , pTab->tnum, 1,
16230 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
16240 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16250 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16260 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
16270 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
16280 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74  Page>=0 ){.    t
16290 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67  num = memRootPag
162a0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
162b0 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
162c0 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20  num;.  }.  pKey 
162d0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
162e0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
162f0 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f  pIndex);..  /* O
16300 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
16310 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
16320 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
16330 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
16340 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
16350 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16360 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
16370 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
16380 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
16390 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
163a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
163b0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
163c0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
163d0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
163e0 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
163f0 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
16400 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
16410 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
16420 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
16430 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
16440 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
16450 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
16460 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
16470 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
16480 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16490 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
164a0 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
164b0 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
164c0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
164d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
164e0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  );..  sqlite3Gen
164f0 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
16500 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62  arse,pIndex,iTab
16510 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50  ,regRecord,0,&iP
16520 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29  artIdxLabel,0,0)
16530 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16550 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65  erInsert, iSorte
16560 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
16570 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
16580 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
16590 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65  se, iPartIdxLabe
165a0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
165b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
165c0 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
165d0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
165e0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
165f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16600 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
16610 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
16620 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16630 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
16640 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
16650 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16660 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
16670 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16690 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
166a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
166b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
166c0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
166d0 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
166e0 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
166f0 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64  ISREG:0));..  ad
16700 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16720 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65  rterSort, iSorte
16730 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
16740 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74  age(v);.  assert
16750 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d  ( pKey!=0 || db-
16760 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
16770 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
16780 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
16790 6e 64 65 78 28 70 49 6e 64 65 78 29 20 26 26 20  ndex(pIndex) && 
167a0 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69  pKey!=0 ){.    i
167b0 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56  nt j2 = sqlite3V
167c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
167d0 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74  ) + 3;.    sqlit
167e0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32  e3VdbeGoto(v, j2
167f0 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
16800 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16810 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
16820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
16830 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  nt(v, OP_SorterC
16840 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
16850 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a   j2, regRecord,.
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
16880 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
16890 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
168a0 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
168b0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
168c0 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78  OE_Abort, pIndex
168d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
168e0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
168f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16900 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16910 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16920 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
16930 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  rter, regRecord,
16940 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
16950 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16960 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c  P_Last, iIdx, 0,
16970 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   -1);.  sqlite3V
16980 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16990 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
169a0 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a   regRecord, 0);.
169b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
169c0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
169d0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
169e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
169f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16a00 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
16a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16a20 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
16a30 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
16a40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16a50 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
16a60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
16a70 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
16a80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16a90 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
16aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ab0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
16ac0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
16ad0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16ae0 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
16af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
16b00 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f  te heap space to
16b10 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f   hold an Index o
16b20 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20  bject with nCol 
16b30 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  columns..**.** I
16b40 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
16b50 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70  cation size to p
16b60 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20  rovide an extra 
16b70 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
16b80 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
16b90 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  d space after th
16ba0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61  e Index object a
16bb0 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70  nd return a.** p
16bc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65  ointer to this e
16bd0 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70  xtra space in *p
16be0 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78  pExtra..*/.Index
16bf0 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74   *sqlite3Allocat
16c00 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20  eIndexObject(.  
16c10 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16c20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
16c30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16c40 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20   i16 nCol,      
16c50 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
16c60 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
16c70 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
16c80 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
16c90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16ca0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78  r of bytes of ex
16cb0 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c  tra space to all
16cc0 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  oc */.  char **p
16cd0 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20  pExtra       /* 
16ce0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  Pointer to the "
16cf0 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a  extra" space */.
16d00 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20  ){.  Index *p;  
16d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
16d20 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a  ocated index obj
16d30 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ect */.  int nBy
16d40 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
16d50 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
16d60 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  for Index object
16d70 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20   + arrays */..  
16d80 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
16d90 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20  izeof(Index)) + 
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16db0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
16dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
16dd0 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
16de0 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20  *)*nCol) +      
16df0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
16e00 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
16e10 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
16e20 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
16e30 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65  1) +     /* Inde
16e40 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20  x.aiRowLogEst   
16e50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
16e60 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a      sizeof(i16)*
16e70 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
16e80 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
16e90 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  umn   */.       
16ea0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
16eb0 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20  (u8)*nCol);     
16ec0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16ed0 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
16ee0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
16ef0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
16f00 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  te + nExtra);.  
16f10 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
16f20 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68  r *pExtra = ((ch
16f30 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69  ar*)p)+ROUND8(si
16f40 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
16f50 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63    p->azColl = (c
16f60 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74  onst char**)pExt
16f70 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f  ra; pExtra += RO
16f80 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
16f90 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  *)*nCol);.    p-
16fa0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28  >aiRowLogEst = (
16fb0 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20  LogEst*)pExtra; 
16fc0 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
16fd0 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
16fe0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75  );.    p->aiColu
16ff0 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72  mn = (i16*)pExtr
17000 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20  a;       pExtra 
17010 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e  += sizeof(i16)*n
17020 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  Col;.    p->aSor
17030 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45  tOrder = (u8*)pE
17040 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  xtra;.    p->nCo
17050 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  lumn = nCol;.   
17060 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43   p->nKeyCol = nC
17070 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45  ol - 1;.    *ppE
17080 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
17090 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20  ) + nByte;.  }. 
170a0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
170b0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
170c0 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
170d0 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
170e0 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
170f0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
17100 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
17110 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
17120 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
17130 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
17140 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
17150 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
17160 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
17170 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
17180 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
17190 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
171a0 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
171b0 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
171c0 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
171d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
171e0 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
171f0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
17200 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17210 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
17220 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
17230 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
17240 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
17250 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
17260 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
17270 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
17280 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17290 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
172a0 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
172b0 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
172c0 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
172d0 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
172e0 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
172f0 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
17300 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
17310 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17320 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  on.  .**.** If t
17330 68 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  he index is crea
17340 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
17350 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
17360 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e  er to the new In
17370 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  dex.** structure
17380 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
17390 79 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  y sqlite3AddPrim
173a0 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b  aryKey() to mark
173b0 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73   the index.** as
173c0 20 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d   the tables prim
173d0 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 69  ary key (Index.i
173e0 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
173f0 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
17400 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  Y).*/.Index *sql
17410 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
17420 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17430 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
17440 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
17450 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
17460 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
17470 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
17480 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
17490 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
174a0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
174b0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
174c0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
174d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
174e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
174f0 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
17500 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
17510 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
17520 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
17530 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
17540 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
17550 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17560 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
17570 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
17580 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
17590 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
175a0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
175b0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
175c0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
175d0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
175e0 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
175f0 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
17600 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
17610 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
17620 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
17630 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
17640 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
17650 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
17660 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
17670 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
17680 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
17690 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
176a0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
176b0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20  {.  Index *pRet 
176c0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  = 0;     /* Poin
176d0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ter to return */
176e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
176f0 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
17700 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
17710 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
17720 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
17730 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
17740 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
17750 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
17760 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
17770 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
17780 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
17790 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
177a0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
177b0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
177c0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
177d0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
177e0 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
177f0 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
17800 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
17810 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
17820 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
17830 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
17840 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
17850 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17860 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
17870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17880 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
17890 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
178a0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
178b0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
178c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
178d0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
178e0 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
178f0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
17900 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
17910 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
17920 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17930 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
17940 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17950 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
17960 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
17970 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
17980 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
17990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
179a0 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
179b0 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61  cated for zExtra
179c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  [] */.  int nExt
179d0 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  raCol;          
179e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
179f0 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75  er of extra colu
17a00 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  mns needed */.  
17a10 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30  char *zExtra = 0
17a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17a30 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
17a40 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
17a50 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65  object */.  Inde
17a60 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20  x *pPk = 0;     
17a70 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
17a80 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55  index for WITHOU
17a90 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
17aa0 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
17ab0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f  locFailed || IN_
17ac0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 7c 7c 20  DECLARE_VTAB || 
17ad0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17ae0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17af0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17b00 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
17b10 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
17b20 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
17b30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17b40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
17b50 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
17b60 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
17b70 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17b80 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
17b90 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
17ba0 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
17bb0 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
17bc0 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
17bd0 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
17be0 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
17bf0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
17c00 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
17c10 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
17c20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
17c30 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
17c40 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
17c50 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
17c60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
17c70 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
17c80 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
17c90 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
17ca0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
17cb0 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
17cc0 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
17cd0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17ce0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
17cf0 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d  t( pName && pNam
17d00 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66  e->z );..#ifndef
17d10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
17d20 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
17d30 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
17d40 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
17d50 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65  eck if the table
17d60 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
17d70 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
17d80 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
17d90 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
17da0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
17db0 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
17dc0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
17dd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
17de0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
17df0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
17e00 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
17e10 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
17e20 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
17e30 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
17e40 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
17e50 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
17e60 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
17e70 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
17e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
17e90 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46  if..    sqlite3F
17ea0 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
17eb0 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
17ec0 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  x", pName);.    
17ed0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72  if( sqlite3FixSr
17ee0 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
17ef0 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
17f00 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
17f10 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
17f20 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
17f30 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
17f40 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
17f50 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
17f60 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
17f70 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
17f80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
17f90 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
17fa0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
17fb0 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d  e, 0, &pTblName-
17fc0 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65  >a[0]);.    asse
17fd0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
17fe0 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  iled==0 || pTab=
17ff0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =0 );.    if( pT
18000 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
18010 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18020 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26      if( iDb==1 &
18030 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  & db->aDb[iDb].p
18040 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53  Schema!=pTab->pS
18050 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73  chema ){.      s
18060 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18070 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
18080 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74     "cannot creat
18090 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f  e a TEMP index o
180a0 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65  n non-TEMP table
180b0 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
180c0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
180d0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
180e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
180f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
18100 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
18110 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
18120 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
18130 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
18140 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
18150 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18160 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20  ( pStart==0 );. 
18170 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
18180 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
18190 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
181a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
181b0 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  dex;.    iDb = s
181c0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
181d0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
181e0 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44  chema);.  }.  pD
181f0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
18200 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  ];..  assert( pT
18210 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
18220 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
18230 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
18240 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
18250 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
18260 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20  _", 7)==0 .     
18270 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75    && db->init.bu
18280 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45  sy==0.#if SQLITE
18290 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
182a0 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73  TION.       && s
182b0 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
182c0 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ble(pTab->zName)
182d0 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ==0.#endif.     
182e0 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
182f0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
18300 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
18310 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ,9)!=0 ){.    sq
18320 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18330 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
18340 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18350 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
18360 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
18370 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18380 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
18390 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
183a0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
183b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
183c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
183d0 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
183e0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
183f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18400 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
18410 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
18420 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
18430 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
18440 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
18450 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18460 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
18470 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
18480 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18490 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
184a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
184b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
184c0 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
184d0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
184e0 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
184f0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
18500 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
18510 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
18520 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
18530 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
18540 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
18550 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
18560 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
18570 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
18580 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
18590 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
185a0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
185b0 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
185c0 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
185d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
185e0 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
185f0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
18600 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
18610 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
18620 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
18630 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
18640 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
18650 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
18660 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
18670 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
18680 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
18690 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
186a0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
186b0 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
186c0 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
186d0 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
186e0 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
186f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
18700 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
18710 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
18720 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
18730 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18740 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
18750 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
18760 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
18770 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
18780 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
18790 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
187a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
187b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
187c0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
187d0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
187e0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
187f0 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
18800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
18810 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18820 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
18830 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
18840 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
18850 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
18860 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18870 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
18880 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
18890 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
188a0 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  Name, pDb->zName
188b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
188c0 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
188d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
188e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
188f0 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
18900 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
18910 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
18920 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18930 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
18940 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18950 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
18960 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
18970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
18980 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18990 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
189a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
189b0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
189c0 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
189d0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
189e0 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
189f0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
18a00 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
18a10 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
18a20 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
18a30 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
18a40 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
18a50 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
18a60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18a70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18a80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18a90 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
18aa0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
18ab0 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
18ac0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18ad0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
18ae0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
18af0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
18b00 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
18b10 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
18b20 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
18b30 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
18b40 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
18b50 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
18b60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18b70 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18b80 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
18b90 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
18ba0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
18bb0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
18bc0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
18bd0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
18be0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
18bf0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
18c00 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
18c10 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
18c20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18c30 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
18c40 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
18c50 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
18c60 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
18c70 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
18c80 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
18c90 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
18ca0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
18cb0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
18cc0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18cd0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
18ce0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
18cf0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
18d00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
18d10 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
18d20 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
18d30 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
18d40 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61 62 2d  (&prevCol, pTab-
18d50 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
18d60 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  -1].zName);.    
18d70 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
18d80 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
18d90 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20  arse, 0,.       
18da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18db0 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
18dc0 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29  D, &prevCol, 0))
18dd0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
18de0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
18df0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18e00 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
18e10 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
18e20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
18e30 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73  etSortOrder(pLis
18e40 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20  t, sortOrder);. 
18e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
18e60 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
18e70 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70  Length(pParse, p
18e80 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a  List, "index");.
18e90 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
18ea0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
18eb0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
18ec0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
18ed0 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
18ee0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
18ef0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18f00 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
18f10 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
18f20 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18f30 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
18f40 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
18f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
18f60 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  xpr!=0 );.    if
18f70 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
18f80 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
18f90 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
18fa0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18fb0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
18fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18fd0 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
18fe0 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
18ff0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
19000 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
19010 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
19020 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
19030 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
19040 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  : 1;.  pIndex = 
19050 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
19060 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
19070 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
19080 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  xtraCol,.       
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
190b0 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20  Name + nExtra + 
190c0 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69  1, &zExtra);.  i
190d0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
190e0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
190f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19100 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
19110 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
19120 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69  NMENT(pIndex->ai
19130 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20  RowLogEst) );.  
19140 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
19150 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
19160 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a  dex->azColl) );.
19170 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
19180 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  = zExtra;.  zExt
19190 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b  ra += nName + 1;
191a0 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
191b0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
191c0 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
191d0 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
191e0 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  b;.  pIndex->onE
191f0 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
19200 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e  or;.  pIndex->un
19210 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72  iqNotNull = onEr
19220 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20  ror!=OE_None;.  
19230 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20  pIndex->idxType 
19240 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49 54 45  = pName ? SQLITE
19250 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
19260 3a 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  : SQLITE_IDXTYPE
19270 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e 64 65  _UNIQUE;.  pInde
19280 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
19290 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
192a0 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  a;.  pIndex->nKe
192b0 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  yCol = pList->nE
192c0 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68  xpr;.  if( pPIWh
192d0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
192e0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
192f0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
19300 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c  Tab, NC_PartIdx,
19310 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20   pPIWhere, 0);. 
19320 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74     pIndex->pPart
19330 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68  IdxWhere = pPIWh
19340 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72  ere;.    pPIWher
19350 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
19360 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
19370 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
19380 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
19390 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
193a0 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
193b0 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
193c0 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
193d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
193e0 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
193f0 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
19400 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
19410 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
19420 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
19430 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
19440 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
19450 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
19460 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65    /* Analyze the
19470 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
19480 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  ions that form t
19490 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
194a0 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72  index and.  ** r
194b0 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73  eport any errors
194c0 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  .  In the common
194d0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
194e0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78  expression is ex
194f0 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62  actly.  ** a tab
19500 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65  le column, store
19510 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
19520 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72  aiColumn[].  For
19530 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73   general express
19540 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c  ions,.  ** popul
19550 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  ate pIndex->aCol
19560 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58  Expr and store X
19570 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61  N_EXPR (-2) in a
19580 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a  iColumn[]..  **.
19590 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
195a0 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77   a warning if tw
195b0 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  o or more column
195c0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
195d0 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  re identical..  
195e0 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
195f0 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20   warning if the 
19600 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65  table primary ke
19610 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  y is used as par
19620 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  t of the.  ** in
19630 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  dex key..  */.  
19640 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
19650 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
19660 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
19670 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
19680 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
19690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
196a0 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69     /* The i-th i
196b0 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
196c0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  */.    int reque
196d0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20  stedSortOrder;  
196e0 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20        /* ASC or 
196f0 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68  DESC on the i-th
19700 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
19710 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19720 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
19730 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
19740 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
19750 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69  .    sqlite3Stri
19760 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d  ngToId(pListItem
19770 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
19780 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
19790 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
197a0 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78  , pTab, NC_IdxEx
197b0 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  pr, pListItem->p
197c0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Expr, 0);.    if
197d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
197e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
197f0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45  e_index;.    pCE
19800 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
19810 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
19820 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
19830 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
19840 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
19850 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
19860 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
19870 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
19880 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19890 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f  arse, "expressio
198a0 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
198b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
198c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74     "UNIQUE const
198f0 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
19900 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19910 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
19920 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  }.      if( pInd
19930 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20  ex->aColExpr==0 
19940 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  ){.        ExprL
19950 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c  ist *pCopy = sql
19960 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
19970 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20  db, pList, 0);. 
19980 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
19990 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70 79 3b  ColExpr = pCopy;
199a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62  .        if( !db
199b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
199c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
199d0 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a  rt( pCopy!=0 );.
199e0 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74 49            pListI
199f0 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b  tem = &pCopy->a[
19a00 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
19a10 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
19a20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
19a30 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19a40 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20  i] = XN_EXPR;.  
19a50 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
19a60 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
19a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20   }else{.      j 
19a80 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  = pCExpr->iColum
19a90 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
19aa0 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20   j<=0x7fff );.  
19ab0 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
19ac0 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d         j = pTab-
19ad0 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  >iPKey;.      }e
19ae0 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
19af0 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  ol[j].notNull==0
19b00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
19b10 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19b20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
19b30 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
19b40 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b  umn[i] = (i16)j;
19b50 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c  .    }.    zColl
19b60 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
19b70 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19b80 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
19b90 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
19ba0 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  l;.      zColl =
19bb0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19bc0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
19bd0 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
19be0 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
19bf0 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
19c00 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
19c10 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
19c20 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
19c30 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
19c40 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
19c50 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
19c60 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
19c70 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
19c80 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30    }else if( j>=0
19c90 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20   ){.      zColl 
19ca0 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
19cb0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  zColl;.    }.   
19cc0 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
19cd0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
19ce0 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20  BINARY;.    if( 
19cf0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
19d00 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
19d10 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
19d20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
19d30 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19d40 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19d50 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
19d60 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
19d70 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
19d80 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
19d90 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
19da0 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
19db0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
19dc0 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75  er[i] = (u8)requ
19dd0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
19de0 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
19df0 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74   the table key t
19e00 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
19e10 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54   index.  For WIT
19e20 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20  HOUT ROWID.  ** 
19e30 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
19e40 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  !=0) this will b
19e50 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50  e the declared P
19e60 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
19e70 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62  .  ** normal tab
19e80 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30  les (when pPk==0
19e90 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
19ea0 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20  he rowid..  */. 
19eb0 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
19ec0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
19ed0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
19ee0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b       int x = pPk
19ef0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
19f00 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
19f10 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  0 );.      if( h
19f20 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d  asColumn(pIndex-
19f30 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65  >aiColumn, pInde
19f40 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29  x->nKeyCol, x) )
19f50 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
19f60 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
19f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19f80 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
19f90 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20  umn[i] = x;.    
19fa0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19fb0 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[i] = pPk->azC
19fc0 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
19fd0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
19fe0 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f  er[i] = pPk->aSo
19ff0 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
1a000 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
1a010 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a020 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  t( i==pIndex->nC
1a030 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65  olumn );.  }else
1a040 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
1a050 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52  Column[i] = XN_R
1a060 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78  OWID;.    pIndex
1a070 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  ->azColl[i] = sq
1a080 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1a090 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
1a0a0 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
1a0b0 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  x);.  if( pParse
1a0c0 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
1a0d0 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
1a0e0 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  dth(pIndex);..  
1a0f0 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
1a100 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20   contains every 
1a110 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61  column of its ta
1a120 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20  ble, then mark. 
1a130 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65   ** it as a cove
1a140 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
1a150 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64  assert( HasRowid
1a160 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c  (pTab) .      ||
1a170 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
1a180 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  | sqlite3ColumnO
1a190 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70  fIndex(pIndex, p
1a1a0 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29  Tab->iPKey)>=0 )
1a1b0 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  ;.  if( pTblName
1a1c0 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e  !=0 && pIndex->n
1a1d0 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43  Column>=pTab->nC
1a1e0 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ol ){.    pIndex
1a1f0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
1a200 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1a210 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1a220 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  ){.      if( j==
1a230 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
1a240 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1a250 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  ( sqlite3ColumnO
1a260 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29  fIndex(pIndex,j)
1a270 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1a280 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73        pIndex->is
1a290 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20  Covering = 0;.  
1a2a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a2b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
1a2c0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1a2d0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1a2e0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1a2f0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1a300 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1a310 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1a320 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1a330 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1a340 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1a350 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1a360 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1a370 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1a380 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1a390 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1a3a0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1a3b0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1a3c0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1a3d0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1a3e0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1a3f0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1a400 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1a410 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1a420 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1a430 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1a440 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1a450 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1a460 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1a470 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1a480 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1a490 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1a4a0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1a4b0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1a4c0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1a4d0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1a4e0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1a4f0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1a500 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1a510 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1a520 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1a530 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1a540 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1a550 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1a560 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1a570 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1a580 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1a590 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1a5a0 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1a5b0 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1a5c0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1a5d0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1a5e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1a5f0 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1a600 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1a610 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1a620 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1a630 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1a640 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1a650 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1a660 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1a670 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1a680 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1a690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1a6a0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1a6b0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1a6c0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1a6d0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1a6e0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1a6f0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1a700 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1a710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a720 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1a730 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1a740 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1a750 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1a760 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1a770 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1a780 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1a790 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1a7a0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1a7b0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1a7c0 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1a7d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1a7e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1a7f0 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1a800 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1a810 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1a820 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1a830 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1a840 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a850 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1a860 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1a870 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1a880 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1a890 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1a8a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1a8b0 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1a8c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a8d0 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1a8e0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1a8f0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1a900 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1a910 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1a920 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1a930 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1a940 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1a950 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1a960 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1a970 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1a980 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1a990 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1a9a0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1a9b0 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1a9c0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1a9d0 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1a9e0 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1a9f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1aa00 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1aa10 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1aa20 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1aa30 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1aa40 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1aa50 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1aa60 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1aa70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1aa80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1aa90 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1aaa0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1aab0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1aac0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1aad0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1aae0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1aaf0 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1ab00 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1ab10 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1ab20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1ab30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1ab50 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1ab60 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1ab70 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1ab80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ab90 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1aba0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1abb0 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1abc0 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1abd0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1abe0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1abf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ac00 20 70 52 65 74 20 3d 20 70 49 64 78 3b 0a 20 20   pRet = pIdx;.  
1ac10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1ac20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1ac30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ac40 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
1ac50 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1ac60 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1ac70 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1ac80 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
1ac90 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1aca0 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  res. .  */.  ass
1acb0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1acc0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  r==0 );.  if( db
1acd0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1ace0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1acf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ad00 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1ad10 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
1ad20 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70  Schema) );.    p
1ad30 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
1ad40 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
1ad50 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
1ad60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad70 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
1ad80 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  x->zName, pIndex
1ad90 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
1ada0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
1adb0 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
1adc0 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
1add0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
1ade0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1adf0 64 62 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  db);.      goto 
1ae00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1ae10 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
1ae20 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
1ae30 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
1ae40 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1ae50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
1ae60 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
1ae70 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
1ae80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1ae90 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1aea0 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1aeb0 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1aec0 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1aed0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
1aee0 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1aef0 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1af00 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1af10 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1af20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1af30 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1af40 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1af50 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1af60 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  n entry for.  **
1af70 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
1af80 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1af90 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61  table and popula
1afa0 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  te the index wit
1afb0 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  h.  ** content. 
1afc0 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   But, do not do 
1afd0 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73  this if we are s
1afe0 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68  imply reading th
1aff0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
1b000 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61    ** table to pa
1b010 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20  rse the schema, 
1b020 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  or if this index
1b030 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
1b040 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f  KEY index.  ** o
1b050 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
1b060 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  D table..  **.  
1b070 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1b080 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1b090 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1b0a0 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1b0b0 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a   PRIMARY KEY.  *
1b0c0 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1b0d0 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1b0e0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1b0f0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1b100 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1b110 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1b120 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1b130 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1b140 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1b150 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
1b160 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
1b170 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  se if( HasRowid(
1b180 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
1b190 65 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  e!=0 ){.    Vdbe
1b1a0 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
1b1b0 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
1b1c0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1b1d0 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
1b1e0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b1f0 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
1b200 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1b210 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
1b220 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1b230 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1b240 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20  rse, 1, iDb);.. 
1b250 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
1b260 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
1b270 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72  e index using Cr
1b280 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62  eateIndex. But b
1b290 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69  efore.    ** doi
1b2a0 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f  ng so, code a No
1b2b0 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  op instruction a
1b2c0 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64  nd store its add
1b2d0 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  ress in .    ** 
1b2e0 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73  Index.tnum. This
1b2f0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
1b300 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78 20  case this index 
1b310 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20  is actually a . 
1b320 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
1b330 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  Y and the table 
1b340 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49  is actually a WI
1b350 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1b360 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68  e. In .    ** th
1b370 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76  at case the conv
1b380 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
1b390 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
1b3a0 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20   will replace.  
1b3b0 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69    ** the Noop wi
1b3c0 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d  th a Goto to jum
1b3d0 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20  p over the VDBE 
1b3e0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1b3f0 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e  elow. */.    pIn
1b400 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69  dex->tnum = sqli
1b410 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1b420 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73   OP_Noop);.    s
1b430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b440 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
1b450 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
1b460 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
1b470 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1b480 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1b490 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1b4a0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
1b4b0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
1b4c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1b4d0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
1b4e0 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73   n = (int)(pPars
1b4f0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20  e->sLastToken.z 
1b500 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50  - pName->z) + pP
1b510 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1b520 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  .n;.      if( pN
1b530 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
1b540 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a   ) n--;.      /*
1b550 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1b560 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1b570 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1b580 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1b590 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1b5a0 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1b5b0 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1b5c0 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
1b5d0 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
1b5e0 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
1b5f0 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
1b600 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1b610 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1b620 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1b630 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1b640 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1b650 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
1b660 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1b670 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
1b680 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1b690 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
1b6a0 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1b6b0 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1b6c0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
1b6d0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1b6e0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1b6f0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1b700 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
1b710 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
1b720 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
1b730 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1b740 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1b750 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
1b760 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
1b770 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1b780 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
1b790 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
1b7a0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1b7b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1b7c0 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
1b7d0 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
1b7e0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
1b7f0 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
1b800 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
1b810 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1b820 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1b830 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1b840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b850 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1b860 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1b870 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1b880 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1b890 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1b8a0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1b8b0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
1b8c0 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
1b8d0 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
1b8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1b8f0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1b900 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1b910 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1b920 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1b930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b940 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
1b950 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  0);.    }..    s
1b960 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1b970 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  re(v, pIndex->tn
1b980 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  um);.  }..  /* W
1b990 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
1b9a0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
1b9b0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
1b9c0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
1b9d0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
1b9e0 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
1b9f0 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
1ba00 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
1ba10 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
1ba20 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
1ba30 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
1ba40 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
1ba50 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
1ba60 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
1ba70 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
1ba80 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
1ba90 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
1baa0 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
1bab0 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
1bac0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
1bad0 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
1bae0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
1baf0 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
1bb00 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
1bb10 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
1bb20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1bb30 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
1bb40 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
1bb50 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
1bb60 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1bb70 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
1bb80 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
1bb90 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
1bba0 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
1bbb0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
1bbc0 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
1bbd0 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
1bbe0 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
1bbf0 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
1bc00 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
1bc10 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1bc20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1bc30 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
1bc40 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
1bc50 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
1bc60 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
1bc70 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a   pRet = pIndex;.
1bc80 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1bc90 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1bca0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1bcb0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1bcc0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1bcd0 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78  ndex ) freeIndex
1bce0 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1bcf0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1bd00 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b  e(db, pPIWhere);
1bd10 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
1bd20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1bd30 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
1bd40 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1bd50 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
1bd60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1bd70 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1bd80 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pRet;.}../*.** F
1bd90 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
1bda0 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
1bdb0 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
1bdc0 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
1bdd0 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
1bde0 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
1bdf0 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
1be00 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
1be10 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
1be20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63  is supposed to c
1be30 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1be40 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1be50 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
1be60 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
1be70 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
1be80 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
1be90 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
1bea0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
1beb0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1bec0 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
1bed0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1bee0 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
1bef0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
1bf00 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
1bf10 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
1bf20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
1bf30 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
1bf40 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
1bf50 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
1bf60 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ination of the f
1bf70 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
1bf80 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
1bf90 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
1bfa0 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
1bfb0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
1bfc0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
1bfd0 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
1bfe0 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
1bff0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1c000 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
1c010 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
1c020 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
1c030 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
1c040 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
1c050 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
1c060 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1c070 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
1c080 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
1c090 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
1c0a0 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
1c0b0 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
1c0c0 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
1c0d0 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
1c0e0 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
1c0f0 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20  dx){.  /*       
1c100 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c           10,  9,
1c110 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20    8,  7,  6 */. 
1c120 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d   LogEst aVal[] =
1c130 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32   { 33, 32, 30, 2
1c140 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73  8, 26 };.  LogEs
1c150 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  t *a = pIdx->aiR
1c160 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20  owLogEst;.  int 
1c170 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61  nCopy = MIN(Arra
1c180 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64  ySize(aVal), pId
1c190 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69  x->nKeyCol);.  i
1c1a0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  nt i;..  /* Set 
1c1b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1c1c0 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20  (number of rows 
1c1d0 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f  in the index) to
1c1e0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a   the estimated .
1c1f0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72    ** number of r
1c200 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1c210 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65 20  . Or 10, if the 
1c220 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
1c230 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69   of rows .  ** i
1c240 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c  n the table is l
1c250 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20 20  ess than that.  
1c260 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78  */.  a[0] = pIdx
1c270 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f  ->pTable->nRowLo
1c280 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d  gEst;.  if( a[0]
1c290 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b  <33 ) a[0] = 33;
1c2a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c2b0 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
1c2c0 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  t(10) );..  /* E
1c2d0 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31  stimate that a[1
1c2e0 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73  ] is 10, a[2] is
1c2f0 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61   9, a[3] is 8, a
1c300 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69  [4] is 7, a[5] i
1c310 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63  s.  ** 6 and eac
1c320 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c  h subsequent val
1c330 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35  ue (if any) is 5
1c340 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26  .  */.  memcpy(&
1c350 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70  a[1], aVal, nCop
1c360 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  y*sizeof(LogEst)
1c370 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79  );.  for(i=nCopy
1c380 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  +1; i<=pIdx->nKe
1c390 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1c3a0 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20  a[i] = 23;      
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1c3c0 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65  sert( 23==sqlite
1c3d0 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20  3LogEst(5) );.  
1c3e0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  }..  assert( 0==
1c3f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29  sqlite3LogEst(1)
1c400 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
1c410 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
1c420 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1c430 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
1c440 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1c450 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
1c460 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
1c470 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1c480 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
1c490 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
1c4a0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1c4b0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
1c4c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1c4d0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
1c4e0 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
1c4f0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
1c500 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
1c510 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c520 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
1c530 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1c540 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
1c550 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
1c560 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
1c570 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1c580 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1c590 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1c5a0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
1c5b0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
1c5c0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
1c5d0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1c5e0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1c5f0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
1c600 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1c610 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1c620 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1c630 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
1c640 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
1c650 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1c660 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
1c670 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
1c680 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
1c690 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c6a0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
1c6b0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
1c6c0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1c6e0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1c6f0 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
1c700 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1c710 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
1c720 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1c730 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
1c740 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1c750 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
1c760 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1c770 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1c780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1c790 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c7a0 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
1c7b0 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
1c7c0 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
1c7d0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1c7e0 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
1c7f0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
1c800 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1c810 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  x;.  }.  iDb = s
1c820 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1c830 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
1c840 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65  pSchema);.#ifnde
1c850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1c860 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
1c870 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53      int code = S
1c880 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58  QLITE_DROP_INDEX
1c890 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
1c8a0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
1c8b0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
1c8c0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
1c8d0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
1c8e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1c8f0 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
1c900 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
1c910 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1c920 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1c930 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
1c940 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1c950 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1c960 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1c970 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1c980 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20  && iDb ) code = 
1c990 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
1c9a0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1c9b0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1c9c0 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
1c9d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
1c9e0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
1c9f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1ca00 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1ca10 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1ca20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1ca30 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
1ca40 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
1ca50 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
1ca60 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
1ca70 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1ca80 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1ca90 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1caa0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1cab0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
1cac0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1cad0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
1cae0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
1caf0 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
1cb00 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69  e=%Q AND type='i
1cb10 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64  ndex'",.       d
1cb20 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1cb30 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
1cb40 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  iDb), pIndex->zN
1cb50 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ame.    );.    s
1cb60 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
1cb70 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
1cb80 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78  b, "idx", pIndex
1cb90 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1cba0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1cbb0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1cbc0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
1cbd0 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
1cbe0 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
1cbf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cc00 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
1cc10 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
1cc20 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
1cc30 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
1cc40 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
1cc50 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1cc60 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
1cc70 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73  ./*.** pArray is
1cc80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1cc90 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
1cca0 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69  s. Each object i
1ccb0 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69  n the.** array i
1ccc0 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20  s szEntry bytes 
1ccd0 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f  in size. This ro
1cce0 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74  utine uses sqlit
1ccf0 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a  e3DbRealloc().**
1cd00 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61   to extend the a
1cd10 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65  rray so that the
1cd20 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20  re is space for 
1cd30 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20  a new object at 
1cd40 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  the end..**.** W
1cd50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1cd60 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
1cd70 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74  Entry contains t
1cd80 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1cd90 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20  of.** the array 
1cda0 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f  (in entries - so
1cdb0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
1cdc0 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a  is ((*pnEntry) *
1cdd0 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a   szEntry) bytes.
1cde0 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a  ** in total)..**
1cdf0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c  .** If the reall
1ce00 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66  oc() is successf
1ce10 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f  ul (i.e. if no O
1ce20 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63  OM condition occ
1ce30 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61  urs), the.** spa
1ce40 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1ce50 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
1ce60 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e  is zeroed, *pnEn
1ce70 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a  try updated to.*
1ce80 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  * reflect the ne
1ce90 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  w size of the ar
1cea0 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  ray and a pointe
1ceb0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c  r to the new all
1cec0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  ocation.** retur
1ced0 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65  ned. *pIdx is se
1cee0 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
1cef0 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20  f the new array 
1cf00 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61  entry in this ca
1cf10 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  se..**.** Otherw
1cf20 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c  ise, if the real
1cf30 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49  loc() fails, *pI
1cf40 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c  dx is set to -1,
1cf50 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e   *pnEntry remain
1cf60 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  s.** unchanged a
1cf70 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72  nd a copy of pAr
1cf80 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ray returned..*/
1cf90 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
1cfa0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
1cfb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1cfc0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1cfd0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1cfe0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1cff0 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
1d000 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
1d010 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
1d020 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
1d030 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
1d040 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d050 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
1d060 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
1d070 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
1d080 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
1d090 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
1d0a0 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
1d0b0 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20  pIdx         /* 
1d0c0 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20  Write the index 
1d0d0 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65  of a new slot he
1d0e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  re */.){.  char 
1d0f0 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70  *z;.  int n = *p
1d100 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e  nEntry;.  if( (n
1d110 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (n-1))==0 ){.
1d120 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d      int sz = (n=
1d130 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
1d140 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
1d150 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1d160 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
1d170 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
1d180 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1d190 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
1d1a0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
1d1b0 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
1d1c0 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
1d1d0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
1d1e0 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
1d1f0 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
1d200 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a  0, szEntry);.  *
1d210 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70  pIdx = n;.  ++*p
1d220 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
1d230 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
1d240 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
1d250 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
1d260 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
1d270 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
1d280 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
1d290 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
1d2a0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1d2b0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
1d2c0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
1d2d0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
1d2e0 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
1d2f0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1d300 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
1d310 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
1d320 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1d330 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1d340 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1d350 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
1d360 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
1d370 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1d380 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1d390 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
1d3a0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1d3b0 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
1d3c0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
1d3d0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
1d3e0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
1d3f0 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  d,.      &i.  );
1d400 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
1d410 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1d420 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1d430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1d440 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
1d450 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1d460 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1d470 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  b, pToken);.  re
1d480 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1d490 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1d4a0 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1d4b0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1d4c0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1d4d0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1d4e0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1d4f0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1d500 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1d510 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1d520 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d530 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1d540 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1d550 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d560 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1d570 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d580 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
1d590 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1d5a0 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
1d5b0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
1d5c0 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
1d5d0 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
1d5e0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
1d5f0 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
1d600 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
1d610 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1d620 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1d630 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1d640 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
1d650 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
1d660 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1d670 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
1d680 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
1d690 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
1d6a0 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1d6b0 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1d6c0 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63   Expand the spac
1d6d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1d6e0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
1d6f0 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63  t object by.** c
1d700 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e  reating nExtra n
1d710 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69  ew slots beginni
1d720 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69  ng at iStart.  i
1d730 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61  Start is zero ba
1d740 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74  sed..** New slot
1d750 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  s are zeroed..**
1d760 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
1d770 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69   suppose a SrcLi
1d780 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e  st initially con
1d790 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65  tains two entrie
1d7a0 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70  s: A,B..** To ap
1d7b0 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69  pend 3 new entri
1d7c0 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c  es onto the end,
1d7d0 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   do this:.**.** 
1d7e0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1d7f0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
1d800 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a  clist, 3, 2);.**
1d810 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61  .** After the ca
1d820 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c  ll above it woul
1d830 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42  d contain:  A, B
1d840 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e  , nil, nil, nil.
1d850 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72  .** If the iStar
1d860 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62  t argument had b
1d870 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66  een 1 instead of
1d880 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73   2, then the res
1d890 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76  ult.** would hav
1d8a0 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c  e been:  A, nil,
1d8b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54   nil, nil, B.  T
1d8c0 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65  o prepend the ne
1d8d0 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20  w slots,.** the 
1d8e0 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75  iStart value wou
1d8f0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65  ld be 0.  The re
1d900 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a  sult then would.
1d910 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c  ** be: nil, nil,
1d920 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a   nil, A, B..**.*
1d930 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
1d940 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74  location fails t
1d950 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e  he SrcList is un
1d960 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a  changed.  The.**
1d970 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1d980 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73  d flag will be s
1d990 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53  et to true..*/.S
1d9a0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1d9b0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20  rcListEnlarge(. 
1d9c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1d9d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d9e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  connection to no
1d9f0 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f  tify of OOM erro
1da00 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  rs */.  SrcList 
1da10 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
1da20 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
1da30 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
1da40 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
1da50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
1da60 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
1da70 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
1da80 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
1da90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1daa0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
1dab0 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
1dac0 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
1dad0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
1dae0 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
1daf0 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
1db00 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
1db10 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
1db20 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  a>=1 );.  assert
1db30 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61  ( pSrc!=0 );.  a
1db40 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
1db50 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20  Src->nSrc );..  
1db60 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69  /* Allocate addi
1db70 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20  tional space if 
1db80 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20  needed */.  if( 
1db90 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b  (u32)pSrc->nSrc+
1dba0 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
1dbb0 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
1dbc0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
1dbd0 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
1dbe0 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20  >nSrc+nExtra;.  
1dbf0 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20    int nGot;.    
1dc00 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1dc10 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
1dc20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dc30 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
1dc40 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
1dc50 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
1dc60 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1dc70 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1dc80 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1dc90 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
1dca0 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
1dcb0 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
1dcc0 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c  .    nGot = (sql
1dcd0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
1dce0 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a  (db, pNew) - siz
1dcf0 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65  eof(*pSrc))/size
1dd00 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31  of(pSrc->a[0])+1
1dd10 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
1dd20 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a  oc = nGot;.  }..
1dd30 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69    /* Move existi
1dd40 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f  ng slots that co
1dd50 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77  me after the new
1dd60 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74  ly inserted slot
1dd70 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68  s.  ** out of th
1dd80 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69  e way */.  for(i
1dd90 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
1dda0 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a  >=iStart; i--){.
1ddb0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45      pSrc->a[i+nE
1ddc0 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  xtra] = pSrc->a[
1ddd0 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e  i];.  }.  pSrc->
1dde0 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  nSrc += nExtra;.
1ddf0 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e  .  /* Zero the n
1de00 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ewly allocated s
1de10 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  lots */.  memset
1de20 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74  (&pSrc->a[iStart
1de30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72  ], 0, sizeof(pSr
1de40 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29  c->a[0])*nExtra)
1de50 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74  ;.  for(i=iStart
1de60 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72  ; i<iStart+nExtr
1de70 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72  a; i++){.    pSr
1de80 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
1de90 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1dea0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1deb0 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64   to the enlarged
1dec0 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65   SrcList */.  re
1ded0 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f  turn pSrc;.}.../
1dee0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1def0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
1df00 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
1df10 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1df20 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
1df30 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
1df40 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
1df50 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
1df60 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73  ven if pTable is
1df70 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53   NULL..**.** A S
1df80 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
1df90 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  ed, or NULL if t
1dfa0 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65  here is an OOM e
1dfb0 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72  rror.  The retur
1dfc0 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d  ned.** SrcList m
1dfd0 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
1dfe0 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20   as the SrcList 
1dff0 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f  that was input o
1e000 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
1e010 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20   a new one.  If 
1e020 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65  an OOM error doe
1e030 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  s occurs, then t
1e040 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f  he prior value o
1e050 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20  f pList.** that 
1e060 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  is input to this
1e070 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f   routine is auto
1e080 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e  matically freed.
1e090 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
1e0a0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
1e0b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1e0c0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
1e0d0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
1e0e0 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
1e0f0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
1e100 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
1e110 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
1e120 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
1e130 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1e140 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
1e150 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1e160 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
1e170 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
1e180 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
1e190 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1e1a0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
1e1b0 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
1e1c0 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
1e1d0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
1e1e0 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
1e1f0 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
1e200 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
1e210 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
1e220 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
1e230 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
1e240 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
1e250 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
1e260 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
1e270 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
1e280 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
1e290 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1e2a0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e2b0 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,0);.**.**
1e2c0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
1e2d0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1e2e0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
1e2f0 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
1e300 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
1e310 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1e320 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1e330 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1e340 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
1e350 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
1e360 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
1e370 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20  database name.  
1e380 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a  If C is defined.
1e390 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e  ** then so is B.
1e3a0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1e3b0 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20  , we never have 
1e3c0 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a  a case where:.**
1e3d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1e3e0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e3f0 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,0,C);.**.**
1e400 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64   Both pTable and
1e410 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61   pDatabase are a
1e420 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f  ssumed to be quo
1e430 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64  ted.  They are d
1e440 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72  equoted.** befor
1e450 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  e being added to
1e460 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f   the SrcList..*/
1e470 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1e480 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a  3SrcListAppend(.
1e490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1e4a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1e4b0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1e4c0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1e4d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e4e0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70  List,     /* App
1e4f0 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c  end to this SrcL
1e500 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65  ist. NULL create
1e510 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  s a new SrcList 
1e520 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1e530 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  le,      /* Tabl
1e540 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e to append */. 
1e550 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1e560 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e    /* Database
1e570 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
1e580 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
1e590 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  ;.  assert( pDat
1e5b0 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62  abase==0 || pTab
1e5c0 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e  le!=0 );  /* Can
1e5d0 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f  not have C witho
1e5e0 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74  ut B */.  assert
1e5f0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
1e600 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1e610 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e620 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
1e630 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
1e640 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1e650 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1e660 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
1e670 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69  loc = 1;.    pLi
1e680 73 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20  st->nSrc = 0;.  
1e690 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1e6a0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1e6b0 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1e6c0 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1e6d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e6e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1e6f0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e700 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1e710 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e720 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1e730 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1e740 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1e750 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1e760 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1e770 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1e780 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1e790 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1e7a0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1e7b0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1e7c0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1e7d0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1e7e0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1e7f0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1e800 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1e810 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1e820 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1e830 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1e840 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1e850 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1e860 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1e870 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1e880 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1e890 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1e8a0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1e8b0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1e8c0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1e8d0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1e8e0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1e8f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e900 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1e910 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1e920 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1e930 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1e940 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1e950 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1e960 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1e970 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1e980 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1e990 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1e9a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1e9b0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1e9c0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1e9d0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1e9e0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1e9f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ea00 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1ea10 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1ea20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1ea30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ea40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1ea50 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1ea60 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1ea70 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1ea80 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1ea90 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1eaa0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1eab0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1eac0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1ead0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1eae0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1eaf0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1eb00 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1eb10 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1eb20 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1eb30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1eb40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1eb50 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1eb60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1eb70 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1eb80 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1eb90 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1eba0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1ebb0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1ebc0 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69  IndexedBy ) sqli
1ebd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ebe0 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1ebf0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  By);.    if( pIt
1ec00 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1ec10 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
1ec20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1ec30 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1ec40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1ec50 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1ec60 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1ec70 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1ec80 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1ec90 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1eca0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ecb0 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1ecc0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1ecd0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1ece0 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1ecf0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ed00 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1ed10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ed20 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1ed30 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1ed40 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1ed50 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1ed60 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1ed70 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1ed80 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1ed90 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1eda0 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1edb0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1edc0 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1edd0 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1ede0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1edf0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1ee00 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1ee10 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1ee20 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1ee30 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1ee40 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1ee50 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ee60 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1ee70 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1ee80 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ee90 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1eea0 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1eeb0 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1eec0 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20  the term has an 
1eed0 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1eee0 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1eef0 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1ef00 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1ef10 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1ef20 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1ef30 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1ef40 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1ef50 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1ef60 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1ef70 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1ef80 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1ef90 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1efa0 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1efb0 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1efc0 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1efd0 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1efe0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1eff0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1f000 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1f010 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1f020 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1f030 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1f040 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1f050 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f060 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1f070 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1f080 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1f090 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1f0a0 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1f0b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1f0c0 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1f0d0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1f0e0 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1f0f0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1f100 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1f110 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1f120 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1f130 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1f140 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1f150 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1f160 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1f170 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1f180 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1f190 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1f1a0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1f1b0 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1f1c0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1f1d0 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1f1e0 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1f1f0 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1f200 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1f210 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f230 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1f240 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1f250 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1f260 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1f270 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1f280 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1f290 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f2a0 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1f2b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f2c0 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1f2d0 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1f2e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f2f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1f300 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1f310 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1f320 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1f330 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1f340 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1f350 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1f360 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1f370 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f380 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1f390 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1f3a0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1f3b0 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1f3c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1f3d0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1f3e0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1f3f0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1f400 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1f410 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1f420 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1f430 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1f440 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f450 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1f460 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1f470 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1f480 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1f490 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1f4a0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1f4b0 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1f4c0 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1f4d0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1f4e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1f4f0 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1f500 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1f510 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1f520 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1f530 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1f540 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1f550 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1f560 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1f570 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1f580 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1f590 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1f5a0 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1f5b0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1f5c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1f5d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1f5e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1f5f0 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1f600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1f610 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1f620 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1f630 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1f640 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1f650 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1f660 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1f670 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f680 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1f690 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1f6a0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1f6b0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
1f6c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f6d0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1f6e0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
1f6f0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1f700 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
1f710 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1f720 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1f730 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1f740 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1f750 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1f760 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1f770 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1f780 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1f790 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1f7a0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1f7b0 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
1f7c0 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1f7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1f7e0 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1f7f0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f800 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1f810 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1f820 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1f830 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28  .isIndexedBy = (
1f840 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f850 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  edBy!=0);.    }.
1f860 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
1f870 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
1f880 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1f890 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
1f8a0 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
1f8b0 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
1f8c0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1f8d0 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
1f8e0 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
1f8f0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
1f900 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1f910 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1f920 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f930 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1f940 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1f950 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f960 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
1f970 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1f980 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
1f990 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
1f9a0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1f9b0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
1f9c0 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
1f9d0 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
1f9e0 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
1f9f0 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
1fa00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1fa10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1fa20 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
1fa30 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
1fa40 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1fa50 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1fa60 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1fa70 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1fa80 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1fa90 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1faa0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1fab0 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1fac0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1fad0 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1fae0 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1faf0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1fb00 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1fb10 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1fb20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1fb30 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1fb40 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1fb50 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1fb60 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1fb70 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1fb80 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1fb90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1fba0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1fbb0 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1fbc0 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1fbd0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1fbe0 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1fbf0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1fc00 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1fc10 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1fc20 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1fc30 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1fc40 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1fc50 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1fc60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1fc70 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1fc80 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1fc90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1fca0 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1fcb0 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1fcc0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1fcd0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1fce0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1fcf0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1fd00 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
1fd10 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
1fd20 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
1fd30 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
1fd40 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1fd50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1fd60 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
1fd70 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1fd80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fd90 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
1fda0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1fdb0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
1fdc0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1fdd0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
1fde0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1fdf0 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
1fe00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
1fe10 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
1fe20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1fe30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1fe40 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1fe50 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
1fe60 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1fe70 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1fe80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1fe90 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
1fea0 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 54  n;.  if( type==T
1feb0 4b 5f 49 4d 4d 45 44 49 41 54 45 20 7c 7c 20 74  K_IMMEDIATE || t
1fec0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1fed0 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  E ){.    for(i=0
1fee0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1fef0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ff00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ff10 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
1ff20 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
1ff30 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20  SIVE)+1);.      
1ff40 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
1ff50 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20  tree(v, i);.    
1ff60 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
1ff70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1ff80 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
1ff90 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 43 4f 4e 43  , (type==TK_CONC
1ffa0 55 52 52 45 4e 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a  URRENT));.}../*.
1ffb0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1ffc0 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d   code for a COMM
1ffd0 49 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IT statement..*/
1ffe0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1fff0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
20000 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
20010 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
20020 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
20030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
20040 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
20050 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
20060 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20070 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
20080 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
20090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
200a0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
200b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
200c0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
200d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
200e0 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  1(v, OP_AutoComm
200f0 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it, 1);.  }.}../
20100 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
20110 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f  BE code for a RO
20120 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
20130 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20140 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
20150 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
20160 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
20170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20180 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
20190 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
201a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
201b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
201c0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
201d0 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
201e0 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
201f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
20200 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
20210 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
20220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
20230 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20240 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
20250 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20260 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20270 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
20280 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
20290 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
202a0 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
202b0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
202c0 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
202d0 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
202e0 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
202f0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
20300 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
20310 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
20320 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
20330 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
20340 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
20350 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
20360 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
20370 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20390 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
203a0 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
203b0 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
203c0 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
203d0 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
203e0 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
203f0 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
20400 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
20410 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
20420 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
20430 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
20440 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
20450 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
20460 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
20470 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
20480 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
20490 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
204a0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
204b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
204c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
204d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
204e0 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
204f0 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
20500 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
20510 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20520 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
20530 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
20540 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
20550 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
20560 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
20570 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
20580 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
20590 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
205a0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
205b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
205c0 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
205d0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
205e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
205f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
20600 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
20610 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
20620 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
20630 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
20640 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
20650 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
20660 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
20670 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
20680 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
20690 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
206a0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
206b0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
206c0 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
206d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
206e0 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
206f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20700 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
20710 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20720 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
20730 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
20740 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
20750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
20770 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20780 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
20790 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
207a0 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
207b0 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
207c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
207d0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
207e0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
207f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20800 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
20810 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
20820 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
20830 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
20840 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
20850 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
20860 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
20870 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
20880 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
20890 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
208a0 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
208b0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
208c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
208d0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
208e0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
208f0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
20900 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
20910 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
20920 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
20930 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
20940 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
20950 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
20960 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
20970 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
20980 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
20990 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
209a0 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
209b0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
209c0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
209d0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
209e0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
209f0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
20a00 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20a10 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20a20 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20a30 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20a40 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20  Toplevel->db;.. 
20a50 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
20a60 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
20a70 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
20a80 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
20a90 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61  || iDb==1 );.  a
20aa0 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
20ab0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
20ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20ad0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
20ae0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
20af0 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
20b00 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
20b10 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20b20 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
20b30 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
20b40 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20b50 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d  ;.    pToplevel-
20b60 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
20b70 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
20b80 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
20b90 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28  _cookie;.    if(
20ba0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
20bb0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
20bc0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
20bd0 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
20be0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
20bf0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
20c00 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
20c10 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
20c20 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20c30 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
20c40 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
20c50 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
20c60 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
20c70 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
20c80 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
20c90 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
20ca0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
20cb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
20cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
20cd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20ce0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
20cf0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
20d00 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
20d10 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
20d20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
20d30 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
20d40 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
20d50 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
20d60 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
20d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
20d80 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
20d90 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
20da0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20db0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20dc0 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
20dd0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
20de0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
20df0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
20e00 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
20e10 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
20e20 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
20e30 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
20e40 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
20e50 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
20e60 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
20e70 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
20e80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
20e90 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
20ea0 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
20eb0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
20ec0 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
20ed0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
20ee0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
20ef0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
20f00 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
20f10 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
20f20 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
20f30 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
20f40 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
20f50 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
20f60 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
20f70 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
20f80 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
20f90 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
20fa0 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
20fb0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
20fc0 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
20fd0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
20fe0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
20ff0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
21000 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
21010 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
21020 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
21030 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
21040 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
21050 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
21060 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
21070 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
21080 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
21090 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
210a0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
210b0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
210c0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
210d0 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
210e0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
210f0 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73  e, iDb);.  DbMas
21100 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
21110 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b  writeMask, iDb);
21120 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
21130 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
21140 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
21150 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
21160 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
21170 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
21180 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
21190 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
211a0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
211b0 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
211c0 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
211d0 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
211e0 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
211f0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
21200 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
21210 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
21220 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
21230 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
21240 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
21250 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
21260 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
21270 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
21280 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
21290 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
212a0 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
212b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
212c0 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
212d0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
212e0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
212f0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21300 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
21310 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
21320 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
21330 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
21340 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
21350 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
21360 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
21370 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
21380 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
21390 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
213a0 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
213b0 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
213c0 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
213d0 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
213e0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
213f0 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
21400 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
21410 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
21420 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
21430 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
21440 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
21450 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
21460 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
21470 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
21480 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
21490 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
214a0 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
214b0 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
214c0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
214d0 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
214e0 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
214f0 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
21500 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
21510 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
21520 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
21530 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
21540 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
21550 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
21560 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
21570 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
21580 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
21590 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
215a0 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
215b0 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
215c0 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
215d0 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
215e0 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
215f0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
21600 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
21610 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
21620 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
21630 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
21640 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
21650 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
21660 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
21670 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
21680 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
21690 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
216a0 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
216b0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
216c0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
216d0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
216e0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
216f0 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
21700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
21710 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
21720 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
21730 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
21740 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
21750 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
21760 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
21770 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
21780 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
21790 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
217a0 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
217b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
217c0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
217d0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
217e0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
217f0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
21800 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
21810 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  .  int errCode, 
21820 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64       /* extended
21830 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
21840 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
21850 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
21860 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
21870 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *p4,         /* 
21880 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
21890 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20  .  i8 p4type,   
218a0 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49       /* P4_STATI
218b0 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e  C or P4_TRANSIEN
218c0 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d  T */.  u8 p5Errm
218d0 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45  sg       /* P5_E
218e0 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b  rrMsg type */.){
218f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
21900 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
21910 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
21920 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
21930 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
21940 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
21950 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
21960 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21970 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
21980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21990 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
219a0 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
219b0 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
219c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
219d0 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72  hangeP5(v, p5Err
219e0 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  msg);.}../*.** C
219f0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
21a00 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20  ue to UNIQUE or 
21a10 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
21a20 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
21a30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21a40 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
21a50 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21a60 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
21a70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
21a80 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
21a90 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
21aa0 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ype */.  Index *
21ab0 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68  pIdx       /* Th
21ac0 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69  e index that tri
21ad0 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72  ggers the constr
21ae0 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  aint */.){.  cha
21af0 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a  r *zErr;.  int j
21b00 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72  ;.  StrAccum err
21b10 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Msg;.  Table *pT
21b20 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
21b30 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72  e;..  sqlite3Str
21b40 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73  AccumInit(&errMs
21b50 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30  g, pParse->db, 0
21b60 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28  , 0, 200);.  if(
21b70 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
21b80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
21b90 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22  rintf(&errMsg, "
21ba0 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64  index '%q'", pId
21bb0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  x->zName);.  }el
21bc0 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  se{.    for(j=0;
21bd0 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
21be0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; j++){.      ch
21bf0 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
21c00 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
21c10 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
21c20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
21c30 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  b->aCol[pIdx->ai
21c40 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
21c50 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20  ;.      if( j ) 
21c60 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
21c70 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
21c80 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , ", 2);.      s
21c90 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65  qlite3XPrintf(&e
21ca0 72 72 4d 73 67 2c 20 22 25 73 2e 25 73 22 2c 20  rrMsg, "%s.%s", 
21cb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
21cc0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
21cd0 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74  zErr = sqlite3St
21ce0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72  rAccumFinish(&er
21cf0 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
21d00 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
21d10 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72  Parse, .    IsPr
21d20 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
21d30 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e  dx) ? SQLITE_CON
21d40 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
21d50 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY .            
21d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d70 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  : SQLITE_CONSTRA
21d80 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
21d90 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
21da0 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
21db0 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
21dc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
21dd0 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
21de0 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
21df0 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
21e00 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
21e10 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
21e20 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
21e30 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
21e40 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
21e50 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
21e60 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
21e70 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
21e80 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
21e90 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
21ea0 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
21eb0 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
21ec0 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
21ed0 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
21ee0 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
21ef0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
21f00 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
21f10 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
21f20 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
21f40 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
21f50 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
21f60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
21f70 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
21f80 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
21f90 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
21fa0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
21fb0 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
21fc0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
21fd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
21fe0 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
21ff0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
22000 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
22010 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
22020 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
22030 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
22040 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
22050 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
22060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
22070 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
22080 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
22090 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
220a0 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
220b0 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
220c0 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
220d0 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
220e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
220f0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
22100 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
22110 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
22120 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
22130 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
22140 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
22150 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
22160 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
22170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
22180 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
22190 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
221a0 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
221b0 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
221c0 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
221d0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
221e0 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
221f0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
22200 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
22210 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
22220 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22230 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
22240 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
22250 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
22260 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
22270 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22280 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
22290 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
222a0 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
222b0 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
222c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
222d0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
222e0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
222f0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
22300 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
22310 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
22320 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
22330 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
22340 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
22350 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
22360 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
22370 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
22380 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
22390 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
223a0 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
223b0 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
223c0 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
223d0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
223e0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
223f0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
22400 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
22410 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
22420 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
22430 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
22440 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
22450 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
22460 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
22470 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
22480 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
22490 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
224a0 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
224b0 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
224c0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
224d0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
224e0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
224f0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
22500 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
22510 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
22520 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
22530 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
22540 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
22550 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
22560 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
22570 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
22580 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
22590 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
225c0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
225d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
225e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
225f0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
22600 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
22610 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
22620 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
22630 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
22640 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
22670 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
22680 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
22690 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
226a0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
226b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
226c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
226d0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
226e0 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
226f0 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
22700 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
22710 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
22720 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
22730 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
22740 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
22750 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
22760 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
22770 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
22780 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
22790 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
227a0 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
227b0 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
227c0 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
227d0 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
227e0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
227f0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
22800 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
22810 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22820 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
22830 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
22840 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
22870 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
22880 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
22890 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
228a0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
228b0 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
228c0 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
228d0 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
228e0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
228f0 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
22900 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
22910 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
22920 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
22930 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
22940 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
22950 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
22960 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
22970 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
22980 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
22990 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
229a0 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
229b0 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
229c0 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
229d0 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
229e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
229f0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
22a00 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22a10 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22a20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
22a30 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
22a40 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
22a50 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
22a60 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
22a70 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
22a80 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
22a90 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
22aa0 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
22ab0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
22ae0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
22af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
22b00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
22b10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
22b20 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
22b30 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
22b40 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
22b50 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
22b60 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
22b70 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
22b80 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
22b90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
22ba0 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
22bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22bc0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
22bd0 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
22be0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
22bf0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22c00 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22c10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
22c20 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
22c30 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
22c40 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
22c50 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
22c60 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
22c70 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
22c80 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
22c90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
22ca0 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
22cb0 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
22cc0 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
22cd0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
22ce0 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
22cf0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
22d00 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
22d10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
22d20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
22d30 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
22d40 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
22d50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
22d60 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
22d70 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
22d80 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
22d90 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
22da0 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
22db0 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
22dc0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
22dd0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
22de0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
22df0 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
22e00 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
22e10 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
22e20 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
22e30 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
22e40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
22e50 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
22e60 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
22e70 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
22e80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22e90 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
22ea0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
22eb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
22ec0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
22ed0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
22ee0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
22ef0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
22f00 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
22f10 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
22f20 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
22f30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
22f40 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
22f50 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
22f60 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
22f70 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
22f80 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
22f90 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
22fa0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
22fb0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
22fc0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
22fd0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
22fe0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22ff0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
23000 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
23010 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
23020 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
23030 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23040 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
23050 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
23060 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
23070 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
23080 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
23090 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
230a0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
230b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
230c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
230d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
230e0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
230f0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
23100 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
23110 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
23120 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
23130 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
23140 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
23150 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
23160 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79  x..**.** The Key
23170 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  Info structure f
23180 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63  or an index is c
23190 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64  ached in the Ind
231a0 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f  ex object..** So
231b0 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
231c0 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
231d0 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72  ces to the retur
231e0 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68  ned pointer.  Th
231f0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75  e.** caller shou
23200 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f  ld not try to mo
23210 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f  dify the KeyInfo
23220 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
23230 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
23240 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
23250 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
23260 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
23270 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
23280 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
23290 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
232a0 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
232b0 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
232c0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
232d0 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
232e0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
232f0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
23300 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
23310 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
23320 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
23330 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
23340 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
23350 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
23360 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
23370 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
23380 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
23390 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
233a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
233b0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
233c0 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
233d0 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
233e0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
233f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23400 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
23410 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
23420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
23430 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
23440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
23450 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
23460 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
23470 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
23480 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
23490 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234b0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
234c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
234d0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
234e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
234f0 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
23500 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
23510 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
23520 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
23530 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
23540 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
23550 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
23560 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
23570 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23580 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
23590 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
235a0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
235b0 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
235c0 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
235d0 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
235e0 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
235f0 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
23600 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
23610 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
23620 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
23630 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
23640 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
23650 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
23660 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
23670 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
23680 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23690 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
236a0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
236b0 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
236c0 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
236d0 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
236e0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
236f0 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
23700 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
23710 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
23720 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
23730 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23740 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23750 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
23760 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
23770 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23780 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
23790 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
237a0 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
237b0 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
237c0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
237d0 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
237e0 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
237f0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23800 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
23810 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
23820 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
23830 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
23840 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
23850 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
23860 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
23870 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
23880 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
23890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
238a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
238b0 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
238c0 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
238d0 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
238e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
238f0 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
23900 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
23910 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
23920 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
23930 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
23940 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
23950 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
23960 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
23970 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
23980 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
23990 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
239a0 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
239b0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
239c0 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
239d0 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
239e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
239f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
23a00 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
23a10 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23a20 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
23a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
23a40 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
23a50 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
23a60 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
23a70 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
23a80 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
23a90 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23aa0 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
23ab0 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
23ac0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
23ad0 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
23ae0 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
23af0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
23b00 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
23b10 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
23b20 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
23b30 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
23b40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
23b50 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
23b60 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
23b70 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
23b80 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
23b90 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23ba0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
23bb0 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
23bc0 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
23bd0 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
23be0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
23bf0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23c00 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
23c10 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
23c20 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
23c30 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
23c40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23c50 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
23c60 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
23c70 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
23c80 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
23c90 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
23ca0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23cb0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
23cc0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
23cd0 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
23ce0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
23cf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
23d00 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.